簡體   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