【问题标题】:read child nodes xml读取子节点xml
【发布时间】:2016-08-13 05:10:45
【问题描述】:

这是我正在尝试读取的 xml。

<VacancyList xmlns="urn:abc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" generated="2016-04-20T11:42:47" xsi:schemaLocation="http://www.abc.in/dtd/vacancy-list.xsd">
  <Vacancy id="1619993" date_start="2016-04-15" date_end="2016-04-22" reference_number="">
     <Versions>
       <Version language="nb">
         <Title>Marketing Specialist</Title>
         <TitleHeading/>
         <Location>CXCXC</Location>
         <Engagement/>
         <DailyHours/>
         <Region>
            <County id="11">sds</County>
            <County id="1">zxzx</County>
            </Country>
         </Region>
         <Categories>
           <Item type="position-type" id="3909">sER</Item>
           <Item type="duration" id="contract">ss</Item>
           <Item type="extent" id="fulltime">sd</Item>
           <Item type="operating-time" id="day">s</Item>
         </Categories>
       </Version>
     </Versions>

 </Vacancy>

</VacancyList>

我想读取节点位置,所以写在下面的代码

XmlDocument xd = new XmlDocument();
        xd.Load("https://abc.in/list.xml");
        XmlNamespaceManager ns = new XmlNamespaceManager(xd.NameTable);
        ns.AddNamespace("msbld", "urn:abc");

        XmlNodeList nodelist = xd.SelectNodes("//msbld:VacancyList", ns);



        if (nodelist != null)
            foreach (XmlNode node in nodelist)
            {
                XmlNode nodelist1 = node.SelectSingleNode("Vacancy");
                if (nodelist1 != null)
                    foreach (XmlNode node1 in nodelist1)
                    {
                       var k = node1.Attributes.GetNamedItem("Location").Value;

                    }
            }

但我在变量“node1”中没有得到任何东西。如何解决这个问题?

还有没有更好的解决方案?

更新1

我修改了代码,但我只得到节点标题。无法让其他人进入版本节点,如位置。

if (nodelist != null)
            foreach (XmlNode node in nodelist)
            {
                XmlNode nodelist1 = node.SelectSingleNode("//msbld:Vacancy/msbld:Versions",ns);
                if (nodelist1 != null) { 
                    XmlNode nodelist2 = nodelist1.SelectSingleNode("//msbld:Version", ns);
                    foreach (XmlNode node3Node in nodelist2)
                    {
                        var k = node3Node.Attributes.GetNamedItem("Location").Value;
                    }


                }
            }

【问题讨论】:

    标签: c# xml xml-namespaces xmldocument xmlnode


    【解决方案1】:

    xmlns="urn:abc" 是一个默认命名空间。请注意,没有前缀的后代元素隐式继承了祖先的默认命名空间。您还需要使用引用默认命名空间 URI 的相同前缀来访问 VacancyLocation

    XmlNode nodelist1 = node.SelectSingleNode("msbld:Vacancy", ns);
    

    您更新的代码引入了一个完全不同的问题;路径表达式开头的/ 将始终引用文档元素,除非您在/ 之前使用. 将上下文显式设置为当前活动上下文,例如:

    XmlNode nodelist1 = node.SelectSingleNode(".//msbld:Vacancy/msbld:Versions",ns);
    

    【讨论】:

    • 我不能使用 node.SelectSingleNode("msbld:Vacancy/Versions/Version", ns);获取位置节点?
    • @Happy 您需要在 XPath 中为所有未加前缀的元素使用前缀:node.SelectSingleNode("msbld:Vacancy/msbld:Versions/msbld:Version", ns);。关于您的问题更新,请参阅我的更新答案。
    • 我仍然在这一行得到错误 var k = node3Node.Attributes.GetNamedItem("Location").Value;在我使用了你的新解决方案之后。我收到错误对象引用未设置为对象的实例。
    • 那么我如何获得元素位置的价值
    • @Happy 这种方式:var k = node3Node.SelectSingleNode("msbld:Location", ns).InnerText;
    【解决方案2】:

    如果您只需要 Location 元素,那么您可以这样做:

    var doc = XElement.Load("path/to/file");
    var location = doc.Descendants
        .FirstOrDefault(e => e.Name.LocalName == "Location"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多