2016-08-19 1 views
0

2つの名前空間を使用するXDocumentを作成する際に問題があります。別のメソッド(まったく同じXNamespaceインスタンスを参照する)で作成されたXElementを追加すると、別のプレフィックスを持つ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> 

(/ EDIT)

グラフ要素を継承する必要がありますいったんe_graphmlに追加されると、デフォルトのxmlnsが表示されますが、明らかにこれらは異なるとみなされます。 graph.ToX()は、返されたグラフXElementに明示的な名前空間属性(xmlns = ...)を追加しません。

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の複製であるが、私はありません最初のXMLテキストから、コード内で完全にXDocumentを作成しています:それでXNamesは、単純にそうように、名前空間を参照してください。

+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

接頭辞を属性に追加しない場合は、その名前空間から属性を削除するだけで済みます。それはあなたが望むように正確にあなたを与えるはずです。 –

関連する問題