我在编写使用两个命名空间的XDocument时遇到了问题。当我添加由不同方法创建的XElements(它指向完全相同的XNamespace实例)时,我用不同的前缀重新声明了xmlns。这是完全正确的XML,但是对于人类可读性来说却是一个熊。如何编写XDocument并始终保持相同的名称空间前缀?
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>
(EDIT) 我想到:
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:y="http://www.yworks.com/xml/graphml">
<graph edgedefault="directed" id="fileReferences"/>
</graphml>
(/编辑)
的图形元素应该继承默认的xmlns一旦被添加到e_graphml中,但显然这些被认为是不同的。注意,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));
或许这就是Force XDocument to not use namespace prefix if namespace is also defined as default重复,但我的代码完全创建的XDocument,不是从最初的XML文本。
粘贴的实际的XML应该是什么样子的样本。 – jdweng