2017-10-20 4 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 
    ... 

또 다른 하나 내가 잘못 뭐하는 거지에 대한

<?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 요소를 제공합니다. 해당 이름의 루트 아래에 요소가 없습니다. 두 번째 예에서는 Root를 포함하는 것을 잊었다. 'foreach (var keyElement in doc.Root.Elements (xNameKey))'가 작동 할 것으로 기대합니다. – rene

+0

@rene 감사합니다. 도움이 되었습니까? 대답으로 답변 해 주시겠습니까? – Dracke

답변

1

첫 번째 예제에서 doc.Root은 이미 <graphml> 요소를 제공합니다. 해당 이름의 루트 아래에 요소가 없으므로 doc.Root.Element("graphml")은이 경우 null을 반환합니다.

첫 번째 예제를 완성하려면 다음과 같이 표시되어야합니다. XNamespace 추가에 유의하십시오. 두 번째 예에서

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

당신은 요소를 반복하여 시작은 루트 요소를 통해 이렇게하면 올바르게

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

에 사용되는 루트를 포함하는 것을 잊었다 :

foreach (var keyElement in doc.Root.Elements(xNameKey))