【问题标题】:Using XPATH to select specific values from an XML document?使用 XPATH 从 XML 文档中选择特定值?
【发布时间】:2023-03-22 09:48:02
【问题描述】:

我正在尝试使用 XPath 从 xml 文档中选择特定值。 xml 存储在字符串变量“tmp”中。此 xml 是对外部 API 执行的查询的结果。

示例 XML 内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Results>
<Checks>
<Check id="wbc">
<Linespeed>6000 </Linespeed>
<Provider>BT WBC </Provider>
</Check>
<Check id="adsl">
<Linespeed>2048 </Linespeed>
<Provider>BT ADSL </Provider>
</Check>
</Checks>
</Results>

在后面的代码中使用 XPATH 我希望能够仅为id=adsl 选择&lt;Linespeed&gt;&lt;Provider&gt;,然后将值存储在字符串变量中以供以后使用。我想在不使用单独的 xslt 样式表的情况下实现这一点。对此的任何帮助将不胜感激!

提前致谢

感谢大家的帮助,使用xpath表达式我现在想实际使用如下:

//Creating an XPATH epression
String strExpression1;
strExpression1 = "Results/Checks/Check[@id = 'adsl']/Linespeed";


//Loading the xml document
XmlDocument doc;
doc = new XmlDocument();
doc.LoadXml(tmp);

//Create an XmlNamespaceManager to resolve the default namespace.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("bk", "urn:schemas-microsoft-com:xslt");

//Selecting Linespeed from Check id='adsl'
XmlNode Check;
XmlElement root = doc.DocumentElement;
Check = root.SelectSingleNode(strExpression1, nsmgr);


//Assigning the the results of the XPATH expression to the string variable Linespeedval
string Linespeedval = Check.ToString();

//Adding a control to display the xpath results of the xml query
AvailabilityCheckerResults2.Controls.Add(new 
LiteralControl(Linespeedval));

理论上我应该能够看到显示在 PlaceHolder 内名为“AvailabilityCheckerResults2”的页面上的值,但我得到了一个错误。有没有办法将 xpath 表达式的结果分配给字符串变量?再次感谢

【问题讨论】:

标签: c# xml xpath sharepoint-2010


【解决方案1】:

&lt;Check id="adsl"/&gt; 选择&lt;Linespeed/&gt;&lt;Provider/&gt; 的xpath 表达式

is : //Linespeed[ancestor::Check[@id = 'adsl']]

或者你可以使用类似的东西:

/Results/Checks/Check[@id = 'adsl']/Linespeed 

这会选择在您的文档中作为带有@id = 'adsl' 的Check 的子项的线速度。

对于提供者,您可以使用相同的方法。

【讨论】:

    【解决方案2】:

    试试/Results/Checks/Check[@id='adsl']/Linespeed/Results/Checks/Check[@id='adsl']/Provider(你想选什么,错过了?)

    【讨论】:

    • 谢谢,我添加了额外的代码来包含这个 xpath 表达式,但我得到一个错误而不是所需的输出。有没有更好更简单的方法来解决这个问题?谢谢
    【解决方案3】:

    尝试以此为起点。

    var elements = XElement.Parse(tmp).Elements("Checks").Elements("Check").Where (xe => xe.Attribute("id").Value=="adsl");
    

    【讨论】:

      【解决方案4】:

      我希望能够选择 &lt;Linespeed&gt;&lt;Provider&gt; 仅用于 id=adsl

      使用

      /*/*/Check[@id = 'adsl']/*[self::Linespeed or self::Provider]
      

      这将选择任何LinespeedProvider 元素,它们是Check 的子元素,其id 属性的字符串值为"adsl",并且是XML 顶部元素的孙子元素文件。

      如果保证一个Check只能有LinespeedProvider孩子,那么上面可以简化为

      /*/*/Check[@id = 'adsl']/*
      

      这将选择作为Check 的子元素的任何元素,其id 属性的字符串值为"adsl",并且是XML 文档顶部元素的孙子元素。

      如果您只想选择 Linespeed 元素,请使用:

      /*/*/Check[@id = 'adsl']/Linespeed
      

      如果您只想选择Provider 元素,请使用:

      /*/*/Check[@id = 'adsl']/Provider
      

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2010-10-27
        • 1970-01-01
        相关资源
        最近更新 更多