如何仅在root中需要名称空间时,如何防止将名称空间添加到root的子节点

时间:2014-03-21 03:12:07

标签: c# xml linq linq-to-xml

我在将命名空间添加到root时遇到了问题..有点根需要是这样的:

<railml version="2.0"
        xmlns="http://www.railml.org/schemas/2009"
        xmlns:dc="http://purl.org/dc/elements/1.1/"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.railml.org/schemas/2009 http://www.railml.org/schemas/2009/railML-2.0/railML.xsd">

我试着像

一样解决自己
XNamespace xmlns = "http://www.railml.org/schemas/2009";
var doc = new XDocument();
XElement root = new XElement(xmlns+"railml");
doc.Add(root);
XAttribute ver = new XAttribute("version", "2.0");
root.Add(ver);
XNamespace ds = "http://purl.org/dc/elements/1.1/";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace schemaLocation = "http://www.railml.org/schemas/2009 http://www.railml.org/schemas/2009/railML-2.0/railML.xsd";
XAttribute x2 = new XAttribute(XNamespace.Xmlns + "dc", ds.NamespaceName);
XAttribute x3 = new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName);
XAttribute x4 = new XAttribute(xsi + "schemaLocation", schemaLocation.NamespaceName);
root.Add(x2);
root.Add(x3);
root.Add(x4);

命名空间正在添加,但问题是,在添加xmlns时,它会将此命名空间添加到root **的所有子节点 如何解决这个问题.. **我在这个xml中有多个标签,这些标签有多个子标签,他们的孩子也有多个孩子.. 我找到了一个向child添加名称空间的解决方案,但是namspace也添加了它们的子子.. 有没有办法删除或阻止这个..

1 个答案:

答案 0 :(得分:3)

递归怎么样?

private static XElement AddNamespace(XElement element, XNamespace ns)
{
    return
        new XElement(
            ns + element.Name.LocalName,
            element.Attributes(),
            element.Elements().Select(x => AddNamespace(x, ns)));
}

为元素和所有后代元素添加命名空间。将其应用于XDocument.Root可以为您提供添加到所有元素的命名空间的整个新文档。

static void Main(string[] args)
{
    var xDoc = XDocument.Load("Input.xml");

    var ns = "http://my-namespace.com";
    var newDoc = new XDocument(AddNamespace(xDoc.Root, ns));
}