无法使用 XDocument 在第一个子项中加载具有 xmlns 属性的文件
Can't load files that has xmlns attribute in the first child with XDocument
我是 XDocument 的新手,但我一直在寻找解决这个问题的方法,但我无法解决。
我需要加载某种 XML 文件 (PNML):
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="id" type ="http://www.pnml.org/version-2009/grammar/ptnet">
..........</net> </pnml>
我无法加载这些文件,除非我将 "xmlns"
作为属性添加到节点 net
。
同时,我自己创建的文件有这个 xmlns
属性,我可以毫无问题地加载它们。
而我需要在我的软件中使用的一些其他软件生成的文件没有这个"xmlns"属性,如果我自己将它添加到这个软件生成的文件中,我可以加载那些文件。
这是我用来加载的代码:
XDocument doc = XDocument.Load(file);
XNamespace ns = @"http://www.pnml.org/version-2009/grammar/pnml";
foreach (XElement element in doc.Element(ns + "pnml")
.Elements("net").Elements("page").Elements("place"))
{ // Do my loading to "place" nodes for example }
但是每当我尝试加载文件时,它都会跳过我的 "foreach" 语句,如果我在 "foreach" 之前添加一些行,例如:
string id= (string) doc.Element(ns + "pnml")
.Element("net").Attribute("id");
它说:
Object reference not set to an instance of an object.
这是我的代码生成的文件示例,也可以从我的代码中读取:
<?xml version="1.0" encoding="utf-8"?>
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="netid" type="http://www.pnml.org/version-2009/grammar/ptnet" xmlns="">
nodes and information </net> </pnml>
注意:我使用此代码保存我的文件:
XNamespace ns = @"http://www.pnml.org/version-2009/grammar/pnml";
XDocument doc = new XDocument
(
new XElement(ns+"pnml"
, new XElement("net",new XAttribute("id", net_id), ...));
我找到了一种无需此 "xmlns" 属性即可保存文件的方法,但是一旦省略它,我就无法从我的代码中加载它。我写的第一个例子是标准格式,我真的需要解决 "xmlns" 问题。
编辑:如果您感到困惑,我很抱歉,我想要的是能够加载 "net" 节点中没有此 "xmlns" 属性的标准 PNML 文件。
尝试这样的事情
var result = doc.Element(ns + "pnml").Descendants().Where(x=>x.Name.LocalName=="net")
您缺少的是元素命名空间继承自其父项。
所以你的 XML:
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="id" type ="http://www.pnml.org/version-2009/grammar/ptnet">
...
包含两个元素。一个是带有命名空间 http://www.pnml.org/version-2009/grammar/pnml
的 pnml
,子节点是 net
,它也有命名空间 http://www.pnml.org/version-2009/grammar/pnml
.
考虑到这一点,您对现有 XML 的查询应该是:
doc.Element(ns + "pnml").Elements(ns + "net")...
生成 XML 的代码应该是:
new XElement(ns + "pnml",
new XElement(ns + "net", new XAttribute("id", net_id), ...));
我是 XDocument 的新手,但我一直在寻找解决这个问题的方法,但我无法解决。
我需要加载某种 XML 文件 (PNML):
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="id" type ="http://www.pnml.org/version-2009/grammar/ptnet">
..........</net> </pnml>
我无法加载这些文件,除非我将 "xmlns"
作为属性添加到节点 net
。
同时,我自己创建的文件有这个 xmlns
属性,我可以毫无问题地加载它们。
而我需要在我的软件中使用的一些其他软件生成的文件没有这个"xmlns"属性,如果我自己将它添加到这个软件生成的文件中,我可以加载那些文件。
这是我用来加载的代码:
XDocument doc = XDocument.Load(file);
XNamespace ns = @"http://www.pnml.org/version-2009/grammar/pnml";
foreach (XElement element in doc.Element(ns + "pnml")
.Elements("net").Elements("page").Elements("place"))
{ // Do my loading to "place" nodes for example }
但是每当我尝试加载文件时,它都会跳过我的 "foreach" 语句,如果我在 "foreach" 之前添加一些行,例如:
string id= (string) doc.Element(ns + "pnml")
.Element("net").Attribute("id");
它说:
Object reference not set to an instance of an object.
这是我的代码生成的文件示例,也可以从我的代码中读取:
<?xml version="1.0" encoding="utf-8"?>
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="netid" type="http://www.pnml.org/version-2009/grammar/ptnet" xmlns="">
nodes and information </net> </pnml>
注意:我使用此代码保存我的文件:
XNamespace ns = @"http://www.pnml.org/version-2009/grammar/pnml";
XDocument doc = new XDocument
(
new XElement(ns+"pnml"
, new XElement("net",new XAttribute("id", net_id), ...));
我找到了一种无需此 "xmlns" 属性即可保存文件的方法,但是一旦省略它,我就无法从我的代码中加载它。我写的第一个例子是标准格式,我真的需要解决 "xmlns" 问题。
编辑:如果您感到困惑,我很抱歉,我想要的是能够加载 "net" 节点中没有此 "xmlns" 属性的标准 PNML 文件。
尝试这样的事情
var result = doc.Element(ns + "pnml").Descendants().Where(x=>x.Name.LocalName=="net")
您缺少的是元素命名空间继承自其父项。
所以你的 XML:
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="id" type ="http://www.pnml.org/version-2009/grammar/ptnet">
...
包含两个元素。一个是带有命名空间 http://www.pnml.org/version-2009/grammar/pnml
的 pnml
,子节点是 net
,它也有命名空间 http://www.pnml.org/version-2009/grammar/pnml
.
考虑到这一点,您对现有 XML 的查询应该是:
doc.Element(ns + "pnml").Elements(ns + "net")...
生成 XML 的代码应该是:
new XElement(ns + "pnml",
new XElement(ns + "net", new XAttribute("id", net_id), ...));