XElement Add函数将xmlns =“”添加到XElement

时间:2010-02-19 10:22:36

标签: c# .net xml xml-serialization linq-to-xml

我有一个为列表对象生成xml的函数:

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 读取:<Example><SubElement>testData</SubElement></Example>

执行add函数后, template.ToString()读取:<RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>

因此,由于某种原因,添加了一个空的命名空间,我怎么能阻止它这样做呢?

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:8)

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

答案 2 :(得分:0)

可能需要正确关闭您的root:

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

答案 3 :(得分:0)

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

所以这是我的脏黑客行为:

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