C#XDocument元素/元素返回null

时间:2017-10-20 15:23:41

标签: c# xml-parsing

我正在尝试使用XDocument读取XML文件。我已尝试过多次尝试加载它,但一切似乎都返回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
     ...

另一个:

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

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

我的XML看起来像这样:

<?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>

关于我做错了什么的任何想法?

1 个答案:

答案 0 :(得分: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();
}

在您的第二个示例中,您忘记在

中包含您正确使用的Root
var xNameKey = XName.Get("key", doc.Root.GetDefaultNamespace().NamespaceName);

当你开始迭代元素时,对Root元素进行迭代:

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