c#:merge 2 xelement将自动空xmlns属性添加到第二个

时间:2015-09-17 08:26:06

标签: c# xml-serialization

我想合并2个xelement:

第一个是这样的:

<element xmlns="test1">
    <child>element child</child>
</element>

第二个是这样的:

<element2>
    <child2>element2 child2</child2>
</element2>

我想获得以下内容:

<root xmlns="fusion">   
    <element xmlns="test1">
        <child>element child</child>
    </element>
    <element2>
        <child2>element2 child2</child2>
    </element2>
</root> 

问题在于,当我尝试在我的根节点中合并2个元素时,它会自动将空的xmlns属性添加到我不想要的第二个元素中:

<root xmlns="fusion">   
    <element xmlns="test1">
        <child>element child</child>
    </element>
    <element2 xmlns="">
        <child2>element2 child2</child2>
    </element2>
</root> 

这是我的代码:

        XNamespace defaultNs = "fusion";
        var root = new XElement(defaultNs + "root");

        root.Add(element);
        root.Add(element2); //when I debug and visualize my element2 I don't have this empty xmlns attribute, it's only when I do the fusion that it appears

1 个答案:

答案 0 :(得分:0)

xmlns定义XML Namespace。它不会在您的应用逻辑中造成任何问题。

网络设置了许多可能性:

1

您正在向名称空间为""的元素添加名称空间为"http://schemas.microsoft.com/developer/msbuild/2003"的元素。这意味着新元素需要xmlns属性。

如果添加名称空间为"http://schemas.microsoft.com/developer/msbuild/2003"的元素,则不需要xmlns属性(因为它继承自父元素):

var n = xDoc.CreateNode(XmlNodeType.Element, "Compile",
            "http://schemas.microsoft.com/developer/msbuild/2003");

2

From here

foreach (XElement e in root.DescendantsAndSelf())
{
    if (e.Name.Namespace == string.Empty)
    {
        e.Name = ns + e.Name.LocalName;
    }
}

3

From here ,基于界面:

string RemoveAllNamespaces(string xmlDocument);

我在这里代表了用于删除XML名称空间的最终干净且通用的C#解决方案:

//Implemented based on interface, not part of algorithm
public static string RemoveAllNamespaces(string xmlDocument)
{
    XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument));

    return xmlDocumentWithoutNs.ToString();
}

//Core recursion function
 private static XElement RemoveAllNamespaces(XElement xmlDocument)
    {
        if (!xmlDocument.HasElements)
        {
            XElement xElement = new XElement(xmlDocument.Name.LocalName);
            xElement.Value = xmlDocument.Value;

            foreach (XAttribute attribute in xmlDocument.Attributes())
                xElement.Add(attribute);

            return xElement;
        }
        return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el)));
    }