2010-08-20 30 views
6

Tôi đang truy vấn phía máy chủ Sharepoint và nhận lại kết quả dưới dạng Xml. Tôi muốn giảm bớt Xml thành một cái gì đó nhẹ hơn trước khi gửi nó đến jQuery thông qua một WebMethod.Tại sao truy vấn XPath này không trả về bất kỳ nút nào?

Tuy nhiên truy vấn XPath của tôi không hoạt động. Tôi nghĩ đoạn mã sau sẽ trả về tất cả các nút Document, nhưng nó không trả về gì cả. Tôi đã sử dụng XPath một chút trước đây, tôi nghĩ rằng //Document làm các trick.

C# truy vấn XPath

XmlDocument xmlResults = new XmlDocument(); 
xmlResults.LoadXml(xml); // XML is a string containing the XML source shown below 
XmlNodeList results = xmlResults.SelectNodes("//Document"); 

XML được truy vấn

<ResponsePacket xmlns="urn:Microsoft.Search.Response"> 
     <Response domain="QDomain"> 
      <Range> 
        <StartAt>1</StartAt> 
        <Count>2</Count> 
        <TotalAvailable>2</TotalAvailable> 
        <Results> 
         <Document relevance="126" xmlns="urn:Microsoft.Search.Response.Document"> 
           <Title>Example 1.doc</Title> 
           <Action> 
            <LinkUrl size="32256" fileExt="doc">http://hqiis99/Mercury/Mercury documents/Example 1.doc</LinkUrl> 
           </Action> 
           <Description /> 
           <Date>2010-08-19T14:44:56+01:00</Date> 
         </Document> 
         <Document relevance="31" xmlns="urn:Microsoft.Search.Response.Document"> 
           <Title>Mercury documents</Title> 
           <Action> 
            <LinkUrl size="0" fileExt="aspx">http://hqiis99/mercury/Mercury documents/Forms/AllItems.aspx</LinkUrl> 
           </Action> 
           <Description /> 
           <Date>2010-08-19T14:49:39+01:00</Date> 
         </Document> 
        </Results> 
      </Range> 
      <Status>SUCCESS</Status> 
     </Response> 
</ResponsePacket> 
+0

XPath sẽ trả về Các nút 'Tài liệu' trong tệp XML nguồn. Bạn có chắc là họ đang ở đó và nếu bạn chắc chắn biến 'results' của bạn trống không? – Oded

+0

Biến chuỗi xml chứa XML được hiển thị ở trên, tôi đã cập nhật mã nguồn của tôi với một nhận xét để giao tiếp này –

Trả lời

11

Bạn đang cố gắng chọn Document yếu tố mà không có một không gian tên ... trong khi không gian tên mặc định thực sự là "urn: Microsoft.Search.Response" ở đây.

Tôi nghĩ rằng bạn muốn một cái gì đó như thế này:

XmlDocument xmlResults = new XmlDocument(); 
xmlResults.LoadXml(xml); 
XmlNamespaceManager manager = new XmlNamespaceManager(xmlResults.NameTable); 
manager.AddNamespace("ns", "urn:Microsoft.Search.Response.Document"); 
XmlNodeList results = xmlResults.SelectNodes("//ns:Document", manager); 

này thấy hai yếu tố.


Nếu bạn có thể sử dụng LINQ to XML thay vào đó, nó làm cho nó tất cả phần nào dễ dàng hơn:

XDocument results = XDocument.Parse(xml); 
XNamespace ns = "urn:Microsoft.Search.Response.Document"; 
var documents = results.Descendants(ns + "Document"); 

Tôi yêu LINQ to xử lý không gian tên XML :)

+0

Ông có thêm một không gian tên: 'urn: Microsoft.Search.Response.Document' – Oded

+0

Tôi không có kinh nghiệm với Xml không gian tên, bước tiếp theo là gì? –

+0

@Peter: Bạn có chắc chắn * muốn sử dụng XPath ở đây không? LINQ to XML sẽ làm cho việc này trở nên dễ dàng hơn, nếu bạn có thể sử dụng nó. –

3

Ngoài ra, bạn có thể thử những điều sau đây và bỏ qua các không gian tên:

XmlDocument xmlResults = new XmlDocument(); 
xmlResults.LoadXml(xmlString); 
XmlNodeList results = xmlResults.SelectNodes("//*[local-name()='Document']"); 
+0

Thú vị - cảm ơn cho mẹo –

Các vấn đề liên quan