我們利用返回XML它看起來像一個第三方網絡服務(上剪下來的簡潔):這是表達此XDocument查詢的最有效方式嗎?
<Response>
<block name="availability">
<block name="cqual">
<a name="result-code" format="text">L</a>
</block>
<block name="exchange">
<a name="code" format="text">MRDEN</a>
</block>
<block name="mqual">
<a name="rate-adaptive" format="text">G</a>
</block>
</block>
<block name="products">
<block>
<a name="product-id" format="counting">1235</a>
<block name="realms">
<block>
<a name="realm" format="text">[email protected]</a>
</block>
</block>
</block>
<block>
<a name="product-id" format="counting">1236</a>
<block name="realms">
<block>
<a name="realm" format="text">[email protected]</a>
</block>
</block>
</block>
<block>
<a name="product-id" format="counting">1237</a>
<block name="realms">
<block>
<a name="realm" format="text">[email protected]</a>
</block>
</block>
</block>
</block>
<status no="0" />
</Response>
對於一個特定的產品代碼,我需要獲得realm
名即內部文本:
<a name="realm" format="text">
-u @ surfuk2</a>
因爲每一個元素名稱是<block>
或<a>
這是一個有點麻煩與LINQ解析到XML或查詢表達式。
以下是獲得特定產品領域名稱的最有效/最有效/最具表現力的方法,例如: 1235:
List<XElement> products = response
.Element("Response")
.Elements("block")
.Where(x => x.Attribute("name").Value == "products")
.Elements("block").ToList();
//
// I broke down the query to aid readability
//
string realm = products.Elements("a")
.Where(x => x.Attribute("name").Value == "product-id")
.Where(y => y.Value == "1235") // hardcoded for example use
.Ancestors()
.First()
.Elements("block")
.Where(z => z.Attribute("name").Value == "realms")
.Elements("block")
.Elements("a")
.First().Value;
感謝您的回覆。我知道我可以更加簡潔地使用XPath,但是我認爲今天在這一點上延伸了我的LINQ腿:-) – Kev 2009-01-12 20:16:04