我正在尝试使用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>
关于我做错了什么的任何想法?
在你的第一个例子中,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))