当仅在根中需要命名空间时,如何防止向根的子节点添加命名空间



在将名称空间添加到根目录时遇到了问题。有点像这样:

<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时,它将此名称空间添加到根**的所有子名称空间如何解决这个问题…**我在这个xml中有多个标签,这些标签有多个子标签,他们的孩子也有多个孩子。我找到了一个解决方案,添加名称空间的孩子,然后名称空间添加到他们的子孩子了。有没有办法消除或防止这个…

递归呢?

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));
}

相关内容

  • 没有找到相关文章

最新更新