2013-04-04 192 views
-2

是否有人能告訴我如何使用XPath和C#在.NET 3.5 Framework下從下面的XML中提取Errors元素?從XML文檔中提取元素

<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SOAP-ENV:Body> 
<ns1:do_OTA_VehAvailRateRQResponse xmlns:ns1="urn:vanguard-web-webservices-ota-IOTA" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<return xsi:type="xsd:string"><OTA_VehAvailRateRS TimeStamp="2013-04-03T18:16:00" TransactionIdentifier="215997103" SequenceNmbr="1" Target="Production" Version="2.0" xmlns="http://www.opentravel.org/OTA/2003/05"> 
    <Errors> 
    <Error Type="1" Code="999">COMPANY NAME FIELD IS INVALID</Error> 
    </Errors> 
</OTA_VehAvailRateRS> 
</return> 
</ns1:do_OTA_VehAvailRateRQResponse> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

你能說清楚你有什麼問題嗎?由於您發佈的代碼量很大,因此很難看到您遇到問題的部分。 – 2013-04-04 05:00:31

+3

這些可怕的問題如何得到upvotes?我們是否無視F.A.Q.現在? – 2013-04-04 05:03:11

+0

Downvoted這個問題。沒有發佈失敗代碼的人當然不值得讚賞。 – 2013-04-04 07:25:39

回答

0

我們不能告訴你在哪裏錯了,如果你不告訴我們你的代碼。

但我們可以猜測。你的錯誤元素是在一個命名空間中,而沒有認識到這一事實是一個經驗不足的常見錯誤,我會高興地認爲這是你的錯誤。

要找到名稱空間中的元素,您需要一個路徑,例如// e:錯誤,其中前綴e被綁定(在C#API級別)到命名空間http://www.opentravel.org/OTA/2003/05。 (對不起,你不要說你沒有經驗,我推斷這是因爲如果你有經驗,你會發布你的XPath代碼)。

+0

在所有應有的尊重,告訴人們他們是「沒有經驗」的答案和重複這個聲明是不應該引以爲傲的東西。我們都在一定程度上沒有經驗 - 在任何*區域。所以稱一個沒有經驗的人不會給我們提供一點新的信息。 – 2013-04-04 16:12:01

+0

是的,綁定到命名空間是問題所在。我的困惑源於命名空間http://www.opentravel.org/OTA/2003/05沒有在XML中作爲前綴,所以我不知道在路徑中使用了什麼前綴。解決方案只是創建一個前綴,如「ota」(我可以命名爲「WTF」),綁定命名空間並在XPAth中使用ota前綴。 – rstuppi 2013-04-04 17:06:43

+0

@Dimitre問題是,當人們沒有向我們展示他們的代碼時,我們必須猜測,部分猜測是猜測他們的經驗水平,因爲這決定了他們可能會犯的錯誤。所以我只是在描述我的推理過程,而不是暗指任何批評。 – 2013-04-04 19:17:56

0

使用

//*[name()='Errors'] 

這將選擇XML文檔,其名稱是 「錯誤」 中的任何元素 - 無論元素的命名空間。

或者,如果你想更精確,並採取確切的命名空間的元素都在的帳戶,你需要使用一個XmlNamespaceManager對象,並使用其AddNamespace() method註冊前綴和命名空間之間的任何需要的關聯。

+0

這是一個糟糕的建議,因爲路徑表達式取決於源中使用的名稱空間前綴。如果你真的想要一個與命名空間無關的查詢,可以使用'// * [local-name()='Errors']' – 2013-04-04 07:27:10

+0

@MichaelKay,它通常可能是一個「不好的推薦」,但在這種情況下,想要的'Errors'元素沒有前綴,XPath表達式使用這個事實。 **選擇一個元素,不管前綴如何,一般情況下都可以選擇具有相同本地名稱但屬於不同名稱空間的元素 - * this *是一個不好的推薦**!此外,您還沒有閱讀最終答案,或者您會看到使用已註冊名稱空間的確切解決方案的建議 - 包含文檔和代碼示例的鏈接。 – 2013-04-04 14:36:48

0

試試這個代碼:

XmlDocument xmlDoc = new XmlDocument(); 

xmlDoc .LoadXml(xmlSting); //If u have a xml string, you can create xmlDocument like this, otherwise u can use file name to create xmlDocument. 

String error = .SelectSingleNode("SOAP-ENV:Envelope/SOAP-ENV:Body/return/Errors/Error").Value; 
0
XmlNodeList errorNodes=new XmlDocument().Load("xmlFilePath").GetElementsByTagName("Errors");