2010-04-04 37 views
60

Tôi có một file xml có chứa yếu tố của nó nhưCác ':' nhân vật, giá trị thập lục phân 0x3A, có thể không được bao gồm trong một tên

<ab:test>Str</ab:test> 

Khi tôi đang cố gắng để truy cập nó bằng cách sử dụng mã:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault(); 

nó đem lại cho tôi lỗi này:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.

Làm thế nào tôi nên truy cập vào nó?

+0

Bạn chắc chắn có một cách để xử lý các không gian tên, do đó bạn không phải (hoặc trong trường hợp này, bạn không thể) đặt chúng vào tên. Bạn nên nhìn vào hướng này. – p4bl0

+1

Không chỉ đặc tả XML nói rằng ":" là [được phép cho tên] (http://www.w3.org/TR/REC-xml/#NT-NameStartChar) (và để bắt đầu tên!), Nhưng [Nhận phương pháp] (http://msdn.microsoft.com/en-us/library/bb357369.aspx) của XName không tài liệu rằng nó ném XmlException! – yoozer8

Trả lời

90

Nếu bạn muốn sử dụng không gian tên, LINQ to XML làm cho rằng thực sự dễ dàng:

XNamespace ab = "http://whatever-the-url-is"; 
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault(); 

Hãy tìm một phần xmlns:ab=... trong tài liệu của bạn để tìm ra các namespace URI "ab" đề cập đến.

+2

Nó hoạt động, nhưng vấn đề là giá trị của xmlns: ab được tạo động dựa trên dấu thời gian. Làm thế nào tôi có thể nhận được giá trị của nó? – coure2011

+5

@ coure06: URI không gian tên là động? Điều đó khá lạ. Nhưng có, bạn có thể lấy nó bằng cách tìm giá trị thuộc tính cho 'XNamespace.Xmlns +" ab "' từ phần tử nào khai báo nó. –

+0

Tôi nhận được lỗi này: http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 – Si8

6

Có quá tải phương thức Get mà bạn có thể muốn thử tính đến không gian tên. Hãy thử điều này:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault(); 
+1

'ab' không phải là không gian tên thực ở đây mặc dù - nó chỉ là bí danh cho không gian tên. (Tôi không biết thuật ngữ đúng không may.) LINQ to XML làm cho việc này trở nên dễ dàng với 'XNamespace'. Thật hiếm khi bạn cần gọi một cách rõ ràng 'XName.Get' trong LINQ to XML. –

+0

ah lỗi của tôi, nhờ làm rõ –

17

Hãy thử đặt namespace của bạn trong { ... } như vậy:

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}"; 
+1

tại sao bạn nên sử dụng dấu ngoặc nhọn? Lợi ích là gì? – barrypicker

+10

Điều đó khiến nó hoạt động :) –

+0

Đã cố gắng ... không hoạt động: / – Si8

3

Hãy thử để có được không gian tên từ tài liệu

var ns = doc.Root.Name.Namespace; 
10

Tôi đã có những lỗi tương tự . Tôi thấy rằng tôi đã thêm mã ...

var ab = "http://whatever-the-url-is"; 

... nhưng ab được xác định là một chuỗi. Điều này gây ra lỗi do OP báo cáo. Thay vì sử dụng từ khóa VAR, tôi đã sử dụng loại dữ liệu thực tế XNamespace ...

... và sự cố đã biến mất.

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