2017-10-20 5 views
2

XDocumentを使用してXMLファイルを読み取ろうとしています。私はそれをロードする多くの試みを試みたが、すべてがnullを返すようだ。 最初の試み:C#XDocument要素/要素がnullを返す

var doc = XDocument.Load(path); 

    var graphml = doc.Root.Element("graphml"); //null 
    foreach (var keyElement in graphml.Elements("key")) //exception 
     ... 
    XElement graph = doc.Element("graph"); //null 
    foreach (var nodeElement in graph.Elements("node")) //exception 
    ... 

もう1:私が間違っているのかについて

<?xml version="1.0" encoding="utf-8"?> 
<graphml xmlns="http://graphml.graphdrawing.org/xmlns"> 
    <key id="pr" for="edge" attr.name="preference" attr.type="int" /> 
... 
    <graph id="G" edgedefault="undirected"> 
    <node id="st1" /> 
    <node id="st2" /> 
    ... 
    </graph> 
</graphml> 

任意のアイデア:

var doc = XDocument.Load(path); 
    XName xNameKey = XName.Get("key", doc.Root.GetDefaultNamespace().NamespaceName); 

    foreach (var keyElement in doc.Elements(xNameKey)) //null 
    ... 

私のXMLは、このようになりますか?

+2

最初の例 'doc.Root'はすでにgraphml要素を提供しています。その名前のルートの下に要素はありません。 2番目の例では、ルートを含めるのを忘れていました。 'foreach(doc.Root.Elements(xNameKey)のvar keyElement)'が動作することを期待しています。 – rene

+0

@reneそれは助けてくれてありがとう、あなたは答えとしてそれを置くことができますか? – Dracke

答えて

1

最初の例では、doc.Rootはすでに<graphml>要素を提供しています。その名前のルートの下に要素がないので、doc.Root.Element("graphml")はその場合nullを返します。

最初の例を完成させるには、次のようにします。XNamespaceの追加に注意してください。あなたのスタートの要素を反復処理するとき、あなたが正しく

var xNameKey = XName.Get("key", doc.Root.GetDefaultNamespace().NamespaceName); 

で使用されるルートを含めるのを忘れて、あなたの2番目の例では

var graphml = doc.Root; 
var ns = (XNamespace)"http://graphml.graphdrawing.org/xmlns"; 
foreach (var keyElement in graphml.Elements(ns + "key")) 
{ 
    keyElement.Dump(); 
} 

ルート要素の上にそれを行う:あなたは

foreach (var keyElement in doc.Root.Elements(xNameKey)) 
関連する問題