2016-08-19 60 views
0

我在编写使用两个命名空间的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文本。

+0

粘贴的实际的XML应该是什么样子的样本。 – jdweng

回答

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> 
+0

另请参阅:http://stackoverflow.com/questions/3312390/xml-default-namespaces-for-unqualified-attribute-names –

+0

不像没有前缀那么理想,但它会做。我现在得到的正是你所说的。 –

+1

如果您只是想要将前缀添加到属性中,您只需从该名称空间中删除属性即可。它应该完全按照你的意愿给你。 –

相关问题