【问题标题】:How to get the first parent node child nodes name value alone?如何单独获取第一个父节点子节点名称值?
【发布时间】:2015-08-06 19:28:44
【问题描述】:

我有以下 xml 文件结构。

<BookStore>
    <Book Id="1">
      <Subject>
        <Rank ID="Chemistry">
            <a>A</a>
        </Rank>
        <Rank ID="Physics">
            <b>B</b>
        </Rank>
      </Subject>
    </Book>
    <Book Id="2">
      <Subject>
        <Rank ID="Science">
            <a>C</a>
        </Rank>
        <Rank ID="English">
            <b>D</b>
        </Rank>
      </Subject>
    </Book>
</BookStore>

我想在迭代时单独获得化学和物理值。如何单独解析和获取该值。

我已尝试使用以下代码。所以我得到了 4 个值。

var platformNodeList1 = xmlSourceFile.SelectNodes("BookStore/Book/Subject/Rank");

谁能提供您对此的宝贵建议?

谁能告诉我如何通过 c# 代码将 .... 带入字符串中?

【问题讨论】:

  • 谁能告诉我如何通过 c# 代码将 .... 带入字符串?
  • xmlSourceFile.SelectSingleNode("BookStore/Book[@Id='1']").OuterXml
  • 非常感谢@har07 :)

标签: c# xml-parsing linq-to-xml


【解决方案1】:

听起来您只需要将 XPath 查询调整为...

var platformNodeList1 = xmlSourceFile.SelectNodes("BookStore/Book[@Id='1']/Subject/Rank");

或者如果你也想迭代书籍......

var books = xmlSourceFile.SelectNodes("BookStore/Book");

foreach(var book in books) {
    var ranks = book.SelectNodes("Subject/Rank");
}

【讨论】:

    【解决方案2】:

    使用 XML Linq

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string input =
                    "<BookStore>" +
                    "<Book Id=\"1\">" +
                      "<Subject>" +
                        "<Rank ID=\"Chemistry\">" +
                            "<a>A</a>" +
                        "</Rank>" +
                        "<Rank ID=\"Physics\">" +
                            "<b>B</b>" +
                        "</Rank>" +
                      "</Subject>" +
                    "</Book>" +
                    "<Book Id=\"2\">" +
                      "<Subject>" +
                        "<Rank ID=\"Science\">" +
                            "<a>C</a>" +
                        "</Rank>" +
                        "<Rank ID=\"English\">" +
                            "<b>D</b>" +
                        "</Rank>" +
                      "</Subject>" +
                    "</Book>" +
                    "</BookStore>";
    
                XDocument xmlSourceFile = XDocument.Parse(input);
    
                var platformNodeList1 = xmlSourceFile.Descendants("Rank").Select(x => x.Attribute("ID").Value).ToList();
            }
        }
    }​
    

    【讨论】:

      【解决方案3】:

      您可以使用 LINQ to XML 解析并使用 LINQ 找到您想要的元素:

       var doc = XDocument.Parse(xml);
      
       var firstBook = doc.Descendants("Book")
           .Single(e => (string)e.Attribute("Id") == "1");
      
       var firstBookRanks = doc.Descendants("Book")
           .Where(e => (string)e.Attribute("Id") == "1")
           .Descendants("Rank");
      
       var chemistry = doc.Descendants("Rank")
           .Single(e => (string)e.Attribute("ID") == "Chemistry");
      
       var physics = doc.Descendants("Rank")
           .Single(e => (string)e.Attribute("ID") == "Physics");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        相关资源
        最近更新 更多