无法在具有XDocument的第一个子项中加载具有xmlns属性的文件

时间:2015-11-13 00:55:23

标签: c# xml linq-to-xml

我是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文件。

2 个答案:

答案 0 :(得分:1)

您缺少的是元素名称空间继承自父母

所以你的XML:

<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
    <net id="id" type ="http://www.pnml.org/version-2009/grammar/ptnet">
...

包含两个元素。一个是pnml,名称空间为http://www.pnml.org/version-2009/grammar/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), ...));

答案 1 :(得分:0)

尝试这样的事情

$(document).ready(function()
{
  $('#inbs2').addClass("glyphicon-time");
  $('#inbs2').find('time').attr("data-livestamp",1447373405);
});