2009-04-24 28 views
39

Làm cách nào để truy cập vào các nhận xét bên trong tài liệu XML bằng XPath?Truy cập Nhận xét trong XML bằng cách sử dụng XPath

Ví dụ:

<table> 
<length> 12 </length> 
<!--Some comment here--> 
</table> 

tôi muốn truy cập vào "Một số bình luận ở đây".

Thanks ...

EDIT: Tôi đang sử dụng MSXML DOM ActiveX và nhận xét lệnh() có vẻ là không ... Bất cứ ý tưởng tại sao?

Trả lời

50

Với con đường

/foo/bar/comment() 

bạn có thể chọn tất cả các ý kiến ​​trong các yếu tố/foo/bar. Có thể phụ thuộc vào ngôn ngữ của bạn lựa chọn, tất nhiên. Nhưng nói chung đây là cách bạn làm điều đó.

+0

Tôi đang sử dụng MSXML DOM ActiveX và lệnh này có vẻ không thành công ... Bất kỳ ý tưởng nào tại sao? – Manoj

+0

Không, tôi không biết tại sao. Đã hơn 7 năm kể từ lần cuối tôi sử dụng thư viện MSXML ... –

+0

Chắc chắn gốc xpath của bạn là ok? Hãy thử "// comment()" để chắc chắn. – annakata

19

Sử dụng nhận xét() chức năng ví dụ: -

/table/length/following::comment()[1] 

chọn những nhận xét đầu tiên mà sau các yếu tố chiều dài.

Sửa

Manoj hỏi trong một chú thích cho câu trả lời này tại sao điều này không làm việc trong MSXML. Lý do sẽ là bạn đang sử dụng MSXML3. Theo mặc định, MSXML3 không sử dụng XPath làm ngôn ngữ lựa chọn của nó, nó mặc định là một ngôn ngữ yếu hơn trước đó (mẫu XSL). Bạn cần đặt XPath làm ngôn ngữ lựa chọn thông qua phương thức setProperty của DOMDocument. Ví dụ (trong JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
dom.setProperty("SelectionLanguage", "XPath"); 

Bây giờ ngôn ngữ XPath đầy đủ sẽ làm việc trong các truy vấn của bạn (lưu ý một thay đổi phá vỡ là các vị từ indexer được 1 trụ sở tại XPath trong khi họ 0 có trụ sở tại Pattern XSL).

+1

Hoặc đơn giản là:/table/comment() [1] – Tomalak

+0

Có lẽ tất cả các cách tiếp cận cho trường hợp cụ thể này nhưng đây là gần nhất tôi có thể nhận được một giải pháp tổng quát hơn của việc tìm kiếm bình luận sau một yếu tố cụ thể. – AnthonyWJones

+1

Tôi đang sử dụng MSXML DOM ActiveX và lệnh này có vẻ không thành công ... Bất kỳ ý tưởng nào tại sao? – Manoj

1

Có lẽ đây coud giúp đỡ, mẫu này loại bỏ Comments

XmlNodeList list = xmlDoc.SelectNodes("//comment()"); 
foreach(XmlNode node in list) 
node.ParentNode.RemoveChild(node); 

nghiêng người từ đây link text

+0

Có thể bạn sẽ gặp lỗi nếu có nhận xét trong thư mục gốc, vì vậy bạn có thể muốn kiểm tra nút đó.ParentNode không phải là rỗng. –

3

Dựa trên nhận xét của OP câu trả lời đăng (và tò mò của tôi là tại sao điều đơn giản này sẽ không hoạt động), đây là đề xuất của tôi:

Sử dụng biểu thức XPath được đề xuất bởi @Anthony, tôi có thể tải thành công nút nhận xét bằng hàm JS sau:

function SelectComment(s) 
{ 
    var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
    if (xDoc) 
    { 
    xDoc.loadXML(s); 
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]"); 
    if (selNode != null) 
     return selNode.text; 
    else 
     return ""; 
    } 
} 

mẫu gọi:

SelectComment("<table><length> 12</length><!--Some comment here--></table>"); 

Output:

"Some comment here" 

Ghi chú:

a. Phiên bản MSXML của bạn có thể khác nhau. Vui lòng sử dụng một cách thích hợp.

b. Loại mã này chắc chắn không được khuyến nghị vì nó chỉ hoạt động trên IE.Tuy nhiên, vì đây là yêu cầu được khai báo rõ ràng của bạn, tôi đã sử dụng ActiveXObject.

c. Bạn chưa đề cập trong nhận xét của mình những gì không thành công trong các biểu thức XPath được đề xuất. Tôi đoán là bạn không truy vấn thuộc tính text của nút đã truy xuất. Hãy nhớ rằng SelectSingleNode luôn trả về một IXmlNode và bạn cần phải truy vấn thuộc tính data hoặc text của nó.

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