2011-11-02 58 views
2

我想从使用XPath的xml文档中选择特定的值。 xml存储在一个字符串varibale“tmp”中。这个XML是在外部API上执行查询的结果。使用XPATH从XML文档中选择特定值?

示例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)); 

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

+0

[?你尝试过什么(HTTP ://mattgemmell.com/2008/12/08/what-have-you-tried/) –

回答

1

XPath表达式来选择<Linespeed/><Provider/><Check id="adsl"/>

是://Linespeed[ancestor::Check[@id = 'adsl']] < - 这将选择所有Linepeed节点,其祖先是一个检查元素与ID = adsl

或者你可以使用类似于:

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

这将选择线速度,这是一个检查与@id =“ADSL”一个孩子,因为它代表在文档中。

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

1

试试这个作为一个起点。

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

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

+0

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

+0

这个XPATH对于你的XML是正确的,你会得到哪个错误? –

1

我希望能够选择<Linespeed><Provider>仅 ID = ADSL

使用

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

这将选择任何LinespeedProvider元素是子Checkid属性的字符串值为"adsl",这是XML文档最重要的元素。

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

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

这将选择其为Check字符串值的子任何元件其id属性为"adsl",这是XML文档的顶层元素的祖父。

如果你想只选择Linespeed元素,使用方法:

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

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

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