如何使用C#

时间:2016-03-14 06:58:14

标签: c# xml linq-to-xml

我有一个xml架构,如下所示

<library>
    <book>
      <id>1</id>
      <name>abc</name>
        <read>
          <data>yes</data>
          <num>20</num>
       </read>
    </book>
    <book>
      <id>20</id>
      <name>xyz</name>
        <read>
          <data>yes</data>
          <num>32</num>
       </read>
    </book>
</library>

现在,如果id20,我需要在<num>

下获取标记<read>的值

我完成了以下代码

 var xmlStr = File.ReadAllText("e_test.xml");
 var str = XElement.Parse(xmlStr);
 var result = str.Elements("book").Where(x => x.Element("id").Value.Equals("20")).ToList();

这会为整个<book>标记提供标识20。从中我只能提取标记<num>的值。

即我需要将值32输入变量

2 个答案:

答案 0 :(得分:2)

在尝试提取num值之前,您需要修复Where子句 - 此时您需要将字符串与整数进行比较。最简单的修复 - 如果您知道您的XML将始终具有id元素,该元素的文本值是整数,则将元素强制转换为int

接下来,我使用SingleOrDefault确保最多只有一个这样的元素,假设您的XML文档应该具有的内容。

然后,您只需使用Element两次向下导航read然后num,然后再将结果转换为int

// Or use XDocument doc = ...; XElement book = doc.Root.Elements("book")...
XElement root = XElement.Load("e_test.xml")
XElement book = root.Elements("book")
                    .Where(x => (int) x.Element("id") == 20)
                    .SingleOrDefault();
if (book == null)
{
    // No book with that ID
}
int num = (int) book.Element("read").Element("num");

答案 1 :(得分:1)

如果您没有使用Linq,那么这个XPath怎么样? XPath可能被更广泛地理解,并且非常简单。找到您的节点的XPath将是:

/library/book[id=20]/read/num

你可以在C#中使用它:

var doc = new XmlDocument();
doc.LoadXml(myString);
var id = 20;
var myPath = "/library/book[id=" + id + "]/read/num";

var myNode = doc.SelectSingleNode(myPath);

然后你可以用myNode做任何你喜欢的事情来获得它的价值等。

有用的参考:

http://www.w3schools.com/xsl/xpath_syntax.asp