2012-01-10 33 views
6

Tôi đang cố xác định biểu thức XPath đúng để trả về giá trị của thuộc tính xsi:type trên phần tử Body. Tôi đã thử những gì có vẻ như tất cả mọi thứ mà không có may mắn. Dựa trên những gì tôi đọc, điều này có vẻ gần nhưng rõ ràng là nó không phải là chính xác. Bất kỳ hướng dẫn nhanh nào để tôi có thể đặt cuối cùng để nghỉ ngơi?Nhận giá trị của xsi: type với xpath

//v20:Body/@xsi:type 

tôi muốn nó trở v20:SmsMessageV1RequestBody

<v20:MessageV1Request> 
    <v20:Header> 
     <v20:Source> 
      <v20:Name>SOURCE_APP</v20:Name> 
      <v20:ReferenceId>1326236916621</v20:ReferenceId> 
      <v20:Principal>2001</v20:Principal> 
     </v20:Source> 
    </v20:Header> 
    <v20:Body xsi:type="v20:SmsMessageV1RequestBody"> 
     <v20:ToAddress>5555551212</v20:ToAddress> 
     <v20:FromAddress>11111</v20:FromAddress> 
     <v20:Message>TEST</v20:Message> 
    </v20:Body> 
</v20:MessageV1Request> 
+4

Biểu thức Xpath có vẻ phù hợp với tôi. Bạn đang sử dụng XPath này trong XQUERY, một XSLT hay cái gì khác? Nguyên nhân có khả năng nhất của một vấn đề ở đây là sự nhầm lẫn gây ra bởi các tiền tố không gian tên. Một cách để loại bỏ không gian tên như là một nguồn gây nhầm lẫn là viết lại xpath như sau: // * [local-name() eq 'Body']/@ * [local-name() eq 'type'] –

+0

Murray là đúng , vì thường có hai cách để xử lý các không gian tên trong XPath - đầu tiên: sử dụng các hàm XPath 'local-name()' và 'namespace-uri()', thứ hai: sử dụng các cơ chế thích hợp của công cụ XPath - ví dụ đối với JAXP chuẩn, bạn phải sử dụng NamespaceContext được cấu hình đúng cách ánh xạ các tiền tố tới các không gian tên. –

Trả lời

2

Như đã chỉ ra trong các ý kiến, bạn có hai lựa chọn:

  1. Sử dụng local-name() để tham khảo các nút mục tiêu mà không quan tâm cho không gian tên
  2. Đăng ký đúng tất cả các không gian tên với công cụ XPath

Dưới đây là cách thực hiện sau này trong Java:

XPath xpath = XPathFactory.newInstance().newXPath(); 
NamespaceContext ctx = new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     if ("v20".equals(prefix)) { 
      return "testNS1"; 
     } else if ("xsi".equals(prefix)) { 
      return "http://www.w3.org/2001/XMLSchema-instance"; 
     } 
     return null; 
    } 
    public String getPrefix(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
    public Iterator getPrefixes(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
}; 
xpath.setNamespaceContext(ctx); 
XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");  
System.out.println(expr.evaluate(doc, XPathConstants.STRING)); 

Lưu ý rằng tôi giả tờ khai namespace sau:

<v20:MessageV1Request xmlns:v20="testNS1" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Bạn sẽ cần phải cập nhật getNamespaceURI sử dụng thực tế giá trị.

0

Tất cả câu trả lời hay phản hồi tuyệt vời. Vấn đề thực sự của tôi dường như đã tự giải quyết với một đêm đi và tươi xây dựng vào buổi sáng. Tôi sẽ tăng cường với phản hồi. Cảm ơn tất cả.

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