2011-11-02 89 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