2010-10-30 46 views
49

Tôi đang truy vấn dịch vụ dựa trên xà phòng và muốn phân tích XML được trả về tuy nhiên khi tôi cố gắng tải XML vào một XDoc để truy vấn dữ liệu. đang nhận được thông báo lỗi 'ký tự không hợp lệ trong đường dẫn'? Điều này (dưới đây) là XML được trả về từ dịch vụ. Tôi chỉ đơn giản muốn có được danh sách các cuộc thi và đặt chúng vào một Danh sách tôi đã thiết lập. XML không tải vào một tài liệu XML mặc dù vậy phải được định dạng đúng ?.Các ký tự không hợp lệ XML trong đường dẫn

Bất kỳ lời khuyên nào về cách tốt nhất để thực hiện việc này và làm tròn lỗi sẽ được đánh giá cao.

<?xml version="1.0" ?> 
- <gsmrs version="2.0" sport="soccer" lang="en" last_generated="2010-08-27 20:40:05"> 
- <method method_id="3" name="get_competitions"> 
    <parameter name="area_id" value="1" /> 
    <parameter name="authorized" value="yes" /> 
    <parameter name="lang" value="en" /> 
    </method> 
    <competition competition_id="11" name="2. Bundesliga" soccertype="default" teamtype="default" display_order="20" type="club" area_id="80" last_updated="2010-08-27 19:53:14" area_name="Germany" countrycode="DEU" /> 
    </gsmrs> 

Đây là mã của tôi, tôi cần để có thể truy vấn dữ liệu trong một XDoc:

string theXml = myGSM.get_competitions("", "", 1, "en", "yes"); 
XmlDocument myDoc = new XmlDocument(); 
MyDoc.LoadXml(theXml); 
XDocument xDoc = XDocument.Load(myDoc.InnerXml); 
+0

đâu là những nhân vật '-' đến từ đâu? Có phải đó là lỗi sao chép/dán hay là nó trong XML thực tế? – Oded

+0

@Oded Tôi đoán chúng đến từ việc sao chép và dán XML từ IE của chế độ xem XML của VS. –

+0

Có tôi đã sao chép từ XMLVisualier trong Visual Studio – Kevin

Trả lời

179

Bạn không hiển thị mã nguồn của bạn, tuy nhiên tôi đoán những gì bạn đang làm là này :

string xml = ... retrieve ...; 
XmlDocument doc = new XmlDocument(); 
doc.Load(xml); // error thrown here 

phương pháp Load hy vọng một tên tập tin không phải là một XML riêng của mình. Để tải một XML thực tế, chỉ cần sử dụng các phương pháp LoadXml:

... same code ... 
doc.LoadXml(xml); 

Tương tự như vậy, sử dụng phương pháp XDocumentLoad(string) hy vọng một filename, không phải là một XML thực tế. Tuy nhiên, không có phương pháp LoadXml, vì vậy cách đúng đắn về tải XML từ một chuỗi là như thế này:

string xml = ... retrieve ...; 
XDocument doc; 
using (StringReader s = new StringReader(xml)) 
{ 
    doc = XDocument.Load(s); 
} 

Như một vấn đề của thực tế khi phát triển bất cứ điều gì, đó là một ý tưởng rất tốt để chú ý đến các ngữ nghĩa (ý nghĩa) tham số không chỉ là các loại của chúng. Khi loại tham số là một string, điều đó không có nghĩa là một tham số có thể nạp vào bất cứ thứ gì là một chuỗi.

Cũng liên quan đến câu hỏi được cập nhật của bạn, bạn không nên sử dụng XmlDocumentXDocument cùng một lúc. Chọn cái này hay cái kia.

+2

Cảm ơn bạn đã trả lời. Điều này làm việc để tải nó vào một XMLDocument nhưng tôi vẫn nhận được các ký tự không hợp lệ trong đường dẫn nếu tôi cố gắng tải XML này vào một XDoc để truy vấn dữ liệu. Bất kỳ ý tưởng? string theXml = myGSM.get_competitions ("", "", 1, "vi", "có"); XmlDocument myDoc = new XmlDocument(); myDoc.LoadXml (theXml); XDocument xDoc = XDocument.Load (myDoc.InnerXml); – Kevin

+0

Xin lỗi lần đầu tiên sử dụng Stackoverflow để gặp sự cố khi thêm và định dạng câu trả lời của tôi, như bạn có thể thấy !!! – Kevin

+0

@Kevin xem câu trả lời cập nhật của tôi. –

2

Nếu đây thực sự là đầu ra của bạn thì đó là XML bất hợp pháp vì các ký tự âm ('-'). Tôi nghi ngờ rằng bạn đã cắt và dán nó từ một trình duyệt như IE. Bạn phải hiển thị XML chính xác từ trình soạn thảo văn bản, không phải trình duyệt.

+0

Tôi đã sao chép và dán từ XML Visualier trong VS 2010, đây chỉ là để mở rộng các nút XML là họ không? – Kevin

+0

@Kevin Nó gần như không thể gỡ lỗi các ký tự sau khi chúng đã được thông qua một màn hình trình duyệt. Có thể là một nhân vật bất hợp pháp đã được biến thành một thứ khác. Tôi nghi ngờ lý do thực sự là gần gũi hơn với @ Tucndj Tucny nhưng nó luôn luôn cần thiết để biết chính xác XML. Ví dụ một không gian ở đầu tài liệu sẽ là bất hợp pháp mặc dù bạn có thể sẽ nhận được một lỗi khác nhau msg –

+0

Rất cám ơn vì thông tin này @ peter.murray.rust Tôi sẽ ghi nhớ điều này trong tương lai. Tất cả là tốt nhất. – Kevin

8

Theo dõi trên Ondrej Tucny của câu trả lời:

Nếu bạn muốn sử dụng một chuỗi xml thay vào đó, bạn có thể sử dụng một XElement, và gọi là "phân tích" phương pháp. (Vì nhu cầu của bạn, XElement và XDocument sẽ đáp ứng nhu cầu của bạn)

Ví dụ;

string theXML = '... get something xml-ish...'; 
XElement xEle = XElement.Parse(theXML); 

// do something with your XElement 

Phương thức Parse của XElement cho phép bạn chuyển một chuỗi XML, trong khi phương thức tải cần tên tệp.

+0

Cảm ơn @Harvey Darvey Điều này hữu ích – abhi

1

Tại sao không

XDocument.Parse(theXml); 

Tôi giả định này sẽ là giải pháp phù hợp

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