2011-10-24 36 views
61

Tôi đang tạo một ứng dụng ping cho trường học với một XML đầy đủ các URL. Tôi bị mất một giờ vì XmlNode.Value đã dẫn đến một giá trị rỗng.Giá trị XmlNode so với Nội dòng

Sau đó, tôi đã đổi thành InnerText và hoạt động tốt.

Bây giờ tôi đã tự hỏi có gì khác biệt vì MSDN nói rằng .Value trả về giá trị của nút và InnerText trả về giá trị nối của nút và tất cả các nút con của nó.

Ai đó có thể giải thích điều này cho tôi không?

<sites> 
<site> 
    <url>www.test.be</url> 
    <email>[email protected]</email> 
</site> 
<site> 
    <url>www.temp.be</url> 
    <email>[email protected]</email> 
</site> 
<site> 
    <url>www.lorim.ipsum</url> 
    <email>[email protected]</email> 
</site></sites> 
+6

Bạn có thể muốn đăng một mẫu tệp XML của mình. –

+9

@FrazellThomas - sự khác biệt giữa .Value và .InnerText có thể dễ dàng hiểu mà không cần xem XML –

+0

Nếu bạn gỡ lỗi và sử dụng cửa sổ ngay lập tức, bạn có thể tiết kiệm cho mình rất nhiều thời gian trong việc gỡ lỗi. Nó cho phép bạn thực thi mã dựa trên ngữ cảnh hiện tại và sẽ ghi lại tất cả các thuộc tính và giá trị của chúng trong XElement. Cách tiếp cận này sẽ cho phép bạn dễ dàng lướt qua biểu đồ đối tượng và xác minh rằng Giá trị là null, nhưng Nội dung bên trong chứa giá trị của bạn. Hi vọng điêu nay co ich. –

Trả lời

74

Nếu, ví dụ, XML của bạn trông giống như <Foo>Bar</Foo> sau đó "Bar" là thực sự được coi là một nút riêng biệt: một nút XmlText (sub-phân loại từ XmlNode). Thuộc tính Value của nút XmlText đó sẽ là "Bar".

"Foo" được coi là XmlElement (cũng được phân loại từ XmlNode). XmlNode.Value trả về các thứ khác nhau dựa trên loại nút. Xem this table cho thấy rằng Value luôn trả lại null cho Element nút.

Nút InnerText của nút Foo trả về "Thanh" vì nó nối các giá trị của con của nó (trong trường hợp này, chỉ một nút XmlText).

+23

Lưu ý: xpath để chọn TextNode sẽ là "Foo/text()" –

+0

Xin chào Robert! Làm thế nào tôi có thể sử dụng serialization với điều này?Nếu tôi lấy ví dụ của bạn Bar, tôi sẽ có một lớp được gọi là "Foo" nhưng tài sản nào tôi phải có để "Thanh" được tuần tự hóa bên trong nó? – PlaTyPuS

0

Về MSDN, Value tài sản của XmlNodeType.Element lợi nhuận:

null. Bạn có thể sử dụng các thuộc tính XmlElement.InnerText hoặc XmlElement.InnerXml để truy cập vào giá trị của nút phần tử.

+2

Có thể cho .InnerXml trả về null không? Từ thử nghiệm ngắn gọn của tôi, nó không xuất hiện như vậy, ví dụ, khi tôi tạo một nút, chỉ định rõ ràng 'node.InnerXml = null;' và sau đó kiểm tra cho 'node.InnerXml == null;' nó sai. Thay vào đó, 'node.InnerXml == string.Empty;' là đúng. Hành vi này tôi có thể dựa vào? Tài liệu MSDN im lặng về điều này. –

1

Đặc tả XML rất cầu kỳ về thuật ngữ và cấu thành nên loại đối tượng XML nào. Như đã đề cập, element không có giá trị. Điều này dành riêng cho attribute (và có thể là một vài loại nút khác) vì attribute có cú pháp là element không, nghĩa là name='value'.

Nếu bạn cho rằng điều đó gây nhầm lẫn, hãy kiểm tra sự khác biệt giữa con và hậu duệ, hoặc Nút gốc và Phần tử tài liệu!

+0

Chỉ còn nhiều lý do để từ bỏ XML cho JSON. – CodeMonkey

7

Tôi có tình huống tương tự. Những gì tôi đã làm là, tôi đã chọn con đầu tiên của nút hiện tại và kiểm tra nếu nó là XMLtext, sau đó hiển thị giá trị của nó.

XmlNodeList xNList = xDOC.SelectNodes("//" + XMLElementname); 

foreach (XmlNode xNode in xNList) 
{ 
    if (xNode.ChildNodes.Count == 1 && 
     xNode.FirstChild.GetType().ToString() == "System.Xml.XmlText") 
    { 
     XMLElements.Add(xNode.FirstChild.Value); 
    } 
    else 
    { 
     XMLElements.Add("This is not a Leaf node"); 
    } 
} 
Các vấn đề liên quan