2010-02-19 91 views
8

我有一个列表对象生成XML的函数:的XElement添加函数添加的xmlns = “” 到的XElement

public XDocument ToXML() 
{ 
    foreach (var row in this) 
    { 
     var xml = row.ToXml(); 
     template.Root.Add(xml); 
    } 
    return template; 
} 

template.ToString()读取:<RootElement xmlns="urn:testTools">

xml reads:<Example><SubElement>testData</SubElement></Example>

添加函数执行了模板后.ToString() reads: <RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>

所以出于某种原因,有一个空的名称空间添加,我怎么能阻止它这样做?

回答

7

将Example和SubElement元素的名称空间设置为与RootElement相同。它添加了xmlns =“”来清除这些元素的名称空间。

+0

好吧我现在明白了为什么它那样做,谢谢! 但它是唯一有用的,如果你合并不同的XML,不同的命名空间,而不是创建一个单一的XML文档。此外,一个空的名称空间标记是无效的XML。 – JJoos 2010-02-19 15:57:12

+1

@JJoos:一个空的命名空间肯定是有效的XML。是什么让你觉得它不是?另外,请记住单个XML文档可能具有来自许多命名空间的元素和属性。 – 2010-03-16 19:36:12

+0

@约翰桑德斯 你是对的,认为这是非法的,因为: http://www.w3.org/TR/REC-xml-names/第2.2节的第一行。 有点混淆。谢谢。 – JJoos 2010-03-19 09:07:15

0

这可能是你的根必须正确关闭:

<RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/> 
0

我用正则表达式的替换元素解决它。 Foole的解决方案不起作用,因为我现在并不总是那个代码中的确切名称空间。

因此,这里是我的肮脏的黑客的作品:

template = XDocument.Parse(new Regex("<ElementName.*>") 
    .Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>")); 
+4

小心你的正则表达式。 XML不是一种常规语言,所以一般来说,正则表达式不应用于XML。 – 2010-03-16 19:38:07

9

这里是没有空的命名空间的XML输出的例子。注意奇怪的以Linq为中心的语法rootNamespace +“MyElementName”,这是秘密。这是与整个文档相同的命名空间,因此不需要添加xmlns。这是连接一个XNamespace +一个字符串,这是一个适用于Linq的“+”重载,并且Linq知道如何处理。 (如果没有Linq,可能会出现连接字符串和非字符串类型的编译错误)。注意这是针对C#项目文件执行的,该文件是一个方便的Xml文件。将其输出到控制台或richtextbox控件。然后取出“rootNamespace +”并注意区别。

 XDocument doc = null; 

     using (StreamReader streamReader = 
      new StreamReader(@"myXml.csproj")) 
     { 
      doc = XDocument.Load(streamReader, LoadOptions.None); 
     } 
     XNamespace rootNamespace = doc.Root.Name.NamespaceName; 

     // A search which finds the ItemGroup which has Reference 
     // elements and returns the ItemGroup XElement. 
     XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup" 
      && p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>(); 

     // Create a completly new element with sub elements. 
     XElement referenceElement = new XElement(rootNamespace + "Reference", 
      new XElement(rootNamespace + "SpecificVersion", bool.FalseString), 
      new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH")); 

     // Add the new element to the main doc, to the end of the Reference elements. 
     element.Add(referenceElement); 

     // Add an attribute after the fact for effect. 
     referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE"); 

     rtb.Text = doc.ToString(SaveOptions.None); 
+0

谢谢你看起来像一个非常好的解决方案!我会在下次遇到这个问题时尝试一下。 – JJoos 2010-04-28 08:32:09

+1

谢谢!这非常有帮助! – 2013-07-21 23:36:18

+1

谢谢。这太棒了! +1 – 2015-09-22 12:03:13

相关问题