我想合并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
答案 0 :(得分:0)
xmlns
定义XML Namespace。它不会在您的应用逻辑中造成任何问题。
网络设置了许多可能性:
您正在向名称空间为""
的元素添加名称空间为"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");
foreach (XElement e in root.DescendantsAndSelf())
{
if (e.Name.Namespace == string.Empty)
{
e.Name = ns + e.Name.LocalName;
}
}
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)));
}