繁体   English   中英

无法使用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”节点内没有thise“ xmlns”属性的标准PNML文件。

您所缺少的是元素名称空间是从其父项继承的

因此,您的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 其子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), ...));

试试这个

var result = doc.Element(ns + "pnml").Descendants().Where(x=>x.Name.LocalName=="net")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM