2010-09-27 34 views
7

Tôi đang cố gắng sử dụng biểu thức xpath để chọn tập hợp nút trong tài liệu xml với các không gian tên khác nhau được xác định.Sự cố khi chạy truy vấn xpath với các không gian tên

Các xml trông giống như sau:

<?POSTEN SND="SE00317644000" REC="5566420989" MSGTYPE="EPIX"?> 
<ns:Msg xmlns:ns="http://www.noventus.se/epix1/genericheader.xsd"> 
    <GenericHeader> 
    <SubsysId>1</SubsysId> 
    <SubsysType>30003</SubsysType> 
    <SendDateTime>2009-08-13T14:28:15</SendDateTime> 
    </GenericHeader> 
    <m:OrderStatus xmlns:m="http://www.noventus.se/epix1/orderstatus.xsd"> 
    <Header> 
     <OrderSystemId>Soda SE</OrderSystemId> 
     <OrderNo>20090811</OrderNo> 
     <Status>0</Status> 
    </Header> 
    <Lines>... 

Tôi muốn chỉ chọn "Msg" -nodes mà có "OrderStatus" con và do đó tôi muốn sử dụng biểu thức xpath sau:/Msg [count ('OrderStatus') > 0] nhưng điều này sẽ không hoạt động vì tôi nhận được thông báo lỗi nói rằng: "Trình quản lý không gian tên hoặc XsltContext cần thiết. Truy vấn này có tiền tố, biến hoặc hàm do người dùng xác định".

Vì vậy, tôi nghĩ rằng tôi muốn sử dụng một biểu thức trông giống như sau:/* [local-name() = 'Msg'] [count ('OrderStatus') > 0] nhưng điều đó dường như không hoạt động .. bất kỳ ý tưởng?

Br,

Andreas

Trả lời

10

Tôi muốn sử dụng xpath biểu thức sau đây:

/Msg[count('OrderStatus')[ 0] 

nhưng điều này sẽ không làm việc kể từ khi tôi nhận được một thông báo lỗi cho biết: "Không gian tênCần có 210 Trình quản lý hoặc XsltContext.

Đây là câu hỏi thường gặp.

Trong XPath, tên không được cố định luôn được coi là thuộc về "không có không gian tên".

Tuy nhiên, các yếu tố bạn muốn chọn thực tế là trong không gian tên "http://www.noventus.se/epix1/genericheader.xsd" .

Bạn có hai cách thể viết biểu thức XPath của bạn:

  1. Sử dụng các cơ sở vật chất của ngôn ngữ lưu trữ kết hợp tiền tố cho tất cả các không gian tên khác nhau mà tên từ biểu thức thuộc. Bạn đã không chỉ ra ngôn ngữ lưu trữ trong trường hợp cụ thể này là gì, vì vậy tôi không thể giúp bạn với điều này. Bạn có thể tìm thấy ví dụ C# here.

Nếu bạn đã liên tiếp đầu ngữ "xxx" đến namespace "http://www.noventus.se/epix1/genericheader.xsd" và tiền tố "yyy" đến namespace "http://www.noventus.se/epix1/orderstatus.xsd", sau đó biểu thức của bạn có thể được viết như sau:

/xxx:Msg[yyy:OrderStatus]

: 2: Nếu bạn don' t muốn sử dụng bất kỳ tiền tố nào cả, biểu thức XPath vẫn có thể được tạo, tuy nhiên nó sẽ không thể đọc được:

/*[local-name() = 'Msg' and *[local-name() = 'OrderStatus']]

Cuối cùng, làm lưu ý:

  1. Để kiểm tra nếu một yếu tố x có một đứa trẻ y nó không phải là cần thiết để kiểm tra tích cực count(y). Chỉ cần sử dụng: x[y]

  2. vị trí XPath là 1 dựa trên. Điều này có nghĩa là NodeSetExpression[0] không bao giờ chọn một nút. Bạn muốn: NodeSetExpression[1]

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