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は、単純にそうように、名前空間を参照してください。
実際のXMLがどのように見えるかのサンプルを貼り付けます。 – jdweng