C# 如何使用C在xml中获取特定的子节点值#

C# 如何使用C在xml中获取特定的子节点值#,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一个如下所示的xml模式 <library> <book> <id>1</id> <name>abc</name> <read> <data>yes</data> <num>20</num> </read> </book>

我有一个如下所示的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>
这将为整个
标记提供id
20
。如何从中仅提取标记
的值


ie是我需要将值
32
放入变量中

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

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

然后,您只需使用
元素
两次,通过
读取
向下导航,然后通过
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");

在尝试提取
num
值之前,您需要修复
Where
子句-此时您正在比较字符串和整数。最简单的修复方法是将元素强制转换为
int
,如果您知道XML总是有一个
id
元素,该元素的文本值为整数

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

然后,您只需使用
元素
两次,通过
读取
向下导航,然后通过
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");

如果您还没有死心塌地地使用Linq,那么这个XPath呢?XPath可能被更广泛地理解,而且非常简单。查找节点的XPath是:

/library/book[id=20]/read/num
您可以在C#中使用它,因此:

然后,您可以使用
myNode
执行任何您喜欢的操作,以获取其值等

有用的参考资料:


如果您不是死心塌地地使用Linq,那么这个XPath怎么样?XPath可能被更广泛地理解,而且非常简单。查找节点的XPath是:

/library/book[id=20]/read/num
您可以在C#中使用它,因此:

然后,您可以使用
myNode
执行任何您喜欢的操作,以获取其值等

有用的参考资料:



您是否真的有一个带有合适根标记的XML文档?到目前为止,您给出的代码无法解析您给出的XML。如果有,下一个问题就是
Where
子句。这就是你想要解决的问题,或者实际上是提取
num
?@JonSkeet我有根标记..我没有在上面的文档中指定..我唯一的pblm是提取numWell这不是你唯一的问题,因为目前代码与任何元素都不匹配。。。接下来,您是否只需要一个匹配元素,因此正在尝试获取一个
num
值?@JonSkeet我得到的是id为20的整个
。但不知道如何从中提取num值。那么您的代码就不是您向我们展示的那样了。您给我们的代码与任何内容都不匹配。您是否确实有一个带有合适根标记的XML文档?到目前为止,您给出的代码无法解析您给出的XML。如果有,下一个问题就是
Where
子句。这就是你想要解决的问题,或者实际上是提取
num
?@JonSkeet我有根标记..我没有在上面的文档中指定..我唯一的pblm是提取numWell这不是你唯一的问题,因为目前代码与任何元素都不匹配。。。接下来,您是否只需要一个匹配元素,因此正在尝试获取一个
num
值?@JonSkeet我得到的是id为20的整个
。但不知道如何从中提取num值。那么您的代码就不是您向我们展示的那样了。您给我们的代码与任何内容都不匹配。请注意,如果
Id
是一个来自用户界面的字符串变量,则您的XPath相当于SQL注入攻击。。。这正是我喜欢使用LINQ to XML进行查询的原因。(一般来说,在另一种语言中嵌入一种语言,无论是XPath、正则表达式、SQL还是其他任何语言,都会让我感到不舒服……)这一点很好。我觉得XPath在回答问题时更简单,但Linq确实具有您描述的优势。最后,我认为客户端验证可能是解决注入攻击问题的更好的解决方案。不,绝对不是。至少不是一般情况。如果您实际上在搜索文本,为什么要阻止自己搜索包含撇号的元素的节点?基本上,使用LINQtoXML可以非常简单地将数据从查询中分离出来。我相信XPath确实支持参数,但我从未在SO中所示的示例中使用过它们。你完全正确。从那以后我就成了“不是n00b”。我的注意力再次被吸引到这一点上,因为这是一次向上投票。请注意,如果
Id
是一个来自用户界面的字符串变量,那么您的XPath相当于SQL注入攻击。。。这正是我喜欢使用LINQ to XML进行查询的原因。(一般来说,在另一种语言中嵌入一种语言,无论是XPath、正则表达式、SQL还是其他任何语言,都会让我感到不舒服……)这一点很好。我觉得XPath在回答问题时更简单,但Linq确实具有您描述的优势。最后,我认为客户端验证可能是解决注入攻击问题的更好的解决方案。不,绝对不是。至少不是一般情况。如果您实际上在搜索文本,为什么要阻止自己搜索包含撇号的元素的节点?基本上,使用LINQtoXML可以非常简单地将数据从查询中分离出来。我相信XPath确实支持参数,但我从未使用过它们