如何编写XDocument并在整个过程中保留相同的名称空间前缀?

时间:2016-08-19 20:53:01

标签: xml namespaces linq-to-xml xelement

我在编写使用两个命名空间的XDocument时遇到了麻烦。当我添加由不同方法(引用完全相同的XNamespace实例)创建的XElements时,我会使用不同的前缀重新声明xmlns。这是完全正确的XML,但它是一个人类可读性的熊。

XDocument xml = new XDocument();
XElement e_graphml = new XElement(ns_graphML + "graphml",
            new XAttribute("xmlns", ns_graphML),
            new XAttribute(XNamespace.Xmlns + "y", ns_yGraphML));
xml.Add(e_graphml);
XElement child = graph.ToX();
e_graphml.Add(child);

图形对象使用我全局可用的ns_graphML和ns_yGraphML对象,两者都是XNamespace类型。然而我收到的XML序列化为文本:

<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:y="http://www.yworks.com/xml/graphml">
  <graph p3:edgedefault="directed" p3:id="fileReferences" xmlns:p3="http://graphml.graphdrawing.org/xmlns" />
</graphml>

(编辑) 我期待:

<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:y="http://www.yworks.com/xml/graphml">
  <graph edgedefault="directed" id="fileReferences"/>
</graphml>

(/编辑)

图元素应该在添加到e_graphml后继承默认的xmlns,但显然这些被认为是不同的。注意thate graph.ToX()不会将显式的命名空间属性(xmlns = ...)添加到返回的图形XElement;其中的XNames只是引用命名空间,如下所示:

XElement e_graph = new XElement(ns_graphML + "graph",
    new XAttribute(ns_graphML + "edgedefault", "directed"),
    new XAttribute(ns_graphML + "id", Name));

也许这是website的副本,但我完全在代码中创建XDocument,而不是从初始XML文本创建。

1 个答案:

答案 0 :(得分:1)

我认为这种行为是有意的。没有名称空间前缀的属性不是任何名称空间的一部分,甚至不是默认名称空间。它需要将该属性放在该命名空间中,但由于它没有要使用的前缀,因此必须创建一个。我认为创建文档会更容易,但是对命名空间使用明确的前缀,它会更清晰。

var e_graphml = new XElement(ns_graphML + "graphml",
    new XAttribute(XNamespace.Xmlns + "g", ns_graphML),
    new XAttribute(XNamespace.Xmlns + "y", ns_yGraphML)
);

这将产生xml,如下所示:

<g:graphml xmlns:g="http://graphml.graphdrawing.org/xmlns" xmlns:y="http://www.yworks.com/xml/graphml">
    <g:graph g:edgedefault="directed" g:id="fileReferences" />
</g:graphml>

如果您特别想让它渲染没有前缀的属性,请在生成时删除命名空间。除非明确要求,否则属性通常不需要命名空间。

var e_graph = new XElement(ns_graphML + "graph",
    new XAttribute("edgedefault", "directed"),
    new XAttribute("id", Name)
);
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:y="http://www.yworks.com/xml/graphml">
    <graph edgedefault="directed" id="fileReferences" />
</graphml>