2009-10-22 92 views
1

我有一個XML文件,我需要在運行時將名稱空間應用於該文件。我搜索了網絡,大多數例子似乎都建議使用「SetAttributeValue」函數。當我使用下面的代碼時,它會拋出一個異常,當我嘗試「ToString()」時出現以下錯誤:無法在運行時將名稱空間添加到XML

The prefix '' cannot be redefined from '' to 'http://schemas.datacontract.org/2004/07/' within the same start element tag. 

任何想法發生了什麼問題?

XDocument data = XDocument.Parse("<Root><Stuff>Test</Stuff></Root>"); 

string ns = "http://schemas.datacontract.org/2004/07/"; 

data.Root.SetAttributeValue("xmlns",ns); 

SaveFile(data.ToString()); 

回答

0

你不能那樣做。命名空間是DOM的基礎。我現在唯一能想到的方法是在整個XML文本中使用String.Replace添加它,然後重新解析結果。

1

執行XSLT轉換:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="your.target.default.namespace" 
> 
    <!-- 
    the "identity template" copies everything verbatim 
    --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- 
    this template creates new elements that 
    are in "your.target.default.namespace" 
    by default 
    --> 
    <xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

以上需要自由命名空間的輸入文檔,並將其複製。只有元素節點被重新創建(通過第二個模板)。元素節點的

再創造使他們在命名空間中的XSLT樣式表中,這裏是「your.target.default.namespace」。

你的榜樣,我會得到:

<Root xmlns="http://schemas.datacontract.org/2004/07/"> 
    <Stuff>Test</Stuff> 
</Root> 
0

這些屬性還纏着我前一段時間。我在創建簡單的播客時使用XNamespace class解決了這個問題。以下是從我的應用程序示例代碼:

XDocument xmlDocument = new XDocument(
       new XDeclaration("1.0", "utf-8", "yes") 
       ); 

XNamespace itunesNamespace = "http://www.itunes.com/dtds/podcast-1.0.dtd"; 
XElement xmlRssElement = new XElement("rss", new XAttribute(XNamespace.Xmlns + "itunes", itunesNamespace), new XAttribute("version", "2.0")); 

XElement xmlChannelElement = new XElement("channel", 
          new XElement("title", "title"), 
          new XElement(itunesNamespace + "explicit", "No")); 

xmlRssElement.Add(xmlChannelElement); 
xmlDocument.Add(xmlRssElement); 
xmlDocument.Save(@"sample-" + DateTime.Now.Ticks + ".xml"); 

注意某些代碼已被澄清去除

您可以讓您的使用XDocument.Parse(原件),並從那裏動態添加類似的命名空間在我的代碼保存文檔

1

默認命名空間之前做實際上是內在的的XElement,它不會讓你通過操縱特性重新定義它。元素的名稱空間作爲其XName的一部分公開。所以要更改元素的名稱空間,您必須重命名它。

XDocument data = XDocument.Parse("<Root><Stuff>Test</Stuff></Root>"); 

XNamespace ns = "http://schemas.datacontract.org/2004/07/"; 

data.Root.Name = ns + data.Root.Name.LocalName; 
2

有點遲到了......

XNamespace ns = "http://schemas.datacontract.org/2004/07/"; 
XDocument xdoc = XDocument.Parse("<Root><Stuff>Test</Stuff></Root>"); 
foreach (var node in xdoc.Descendants()) { node.Name = ns + node.Name.LocalName; } 
xdoc.Dump(); 

<Root xmlns="http://schemas.datacontract.org/2004/07/"> 
    <Stuff>Test</Stuff> 
</Root> 
相關問題