使用XPATH从XML文档中选择特定值?

时间:2011-11-02 13:37:00

标签: c# xml xpath sharepoint-2010

我正在尝试使用XPath从xml文档中选择特定值。 xml存储在字符串varibale“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我希望能够仅为<Linespeed>选择<Provider>id=adsl,然后将值存储在字符串变量中供以后使用。我希望在没有使用单独的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表达式的结果分配给字符串变量?再次感谢

4 个答案:

答案 0 :(得分:1)

以此为出发点。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

<Linespeed/>

选择<Provider/><Check id="adsl"/>的xpath表达式

是://Linespeed[ancestor::Check[@id = 'adsl']]&lt; - 这将选择其祖先是具有id = adsl的检查元素的所有Linespeed节点

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

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

这将选择行速度,该行速度是具有@id ='adsl'的Check的子项,因为它在您的文档中。

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

答案 3 :(得分:1)

  

我希望能够仅为<Linespeed><Provider>选择   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