2009-11-02 8 views
16

Tôi vừa gặp vấn đề khi sử dụng XmlDocument.LoadXml.XmlDocument.Load Vs XmlDocument.LoadXml

Ứng dụng này được đâm, đem lại cho các lỗi sau:

"Data at the root level is invalid. Line 1, position 1"

Sau khi kiểm tra tình hình XML và việc tìm kiếm không có gì sai với nó, tôi googled một chút và tìm thấy một mẹo để sử dụng XmlDocument.Load thay vì XmlDocument.LoadXml.

Tôi đã thử nó và nó hoạt động hoàn hảo.

Câu hỏi của tôi là: Sự khác nhau giữa 2 phương pháp và điều gì có thể khiến một phương thức hoạt động và phương pháp kia bị lỗi?

Trả lời

32

XmlDocument.Load được sử dụng để tải XML từ luồng, TextReader, đường dẫn/URL hoặc XmlReader. XmlDocument.LoadXml được sử dụng để tải XML chứa trong một chuỗi.

Về cơ bản chúng là các cách tải XML khác nhau, tùy thuộc vào nơi XML thực sự được lưu trữ. Vì vậy, có vẻ như bạn đang sử dụng phương pháp sai cho vị trí của XML.

20

Bạn có đang cố sử dụng XmlDocument.LoadXml và chuyển tên của tệp không? Nó không làm điều đó - nó giả định rằng chuỗi bạn vượt qua trong XML. Vì vậy, bạn có thể sử dụng:

doc.LoadXml("<root><child /><root>"); 

hoặc

doc.Load("myfile.xml"); 

Nếu điều đó không giúp đỡ, bạn có thể hiển thị thất bại của bạn và mã làm việc? Có nhiều cách khác nhau mà bạn có thể đã thay đổi từ việc sử dụng LoadXml-Load ...

+0

Tôi đang sử dụng phương pháp doc.LoadXml. Tôi có tệp xml cũng chứa tệp định nghĩa loại tài liệu. Tôi đã đặt nó vào tệp SoccerMatchPlus.dtd, nơi tệp xml tồn tại. Tôi gặp lỗi khi sử dụng phương thức doc.LoadXml như Không thể tìm thấy tệp 'C: \ Windows \ system32 \ SoccerMatchPlus.dtd'. Tại sao phương thức doc.LoadXml tìm tệp trong thư mục 'C: \ Windows \ system32?Tôi có thể thay đổi đường dẫn của nó trong thời gian chạy không? –

+0

@Rais: Có vẻ như bạn có thể muốn bắt đầu một câu hỏi mới ... –

+0

ok Tôi đăng câu hỏi của mình, tôi nghĩ bạn đúng. Cảm ơn. –

2

Load() tải từ một nguồn nào đó, trong khi LoadXml() tải trực tiếp từ một chuỗi

3

Giả sử bạn sử dụng XmlDocument.LoadXmlDocument.LoadXml trong phải cách sự cố này có thể do Byte Order Mark gây ra.

Điều này other question có thể hữu ích.

+0

Có, điều này. Tôi vừa phát hiện ra, một cách khó khăn, rằng tôi không nên chuyển đổi một 'byte []' thành một 'chuỗi' (ngay cả khi tôi biết mã hóa) trước khi tải một' XmlDocument'. Đây là lý do chính xác - tôi đã nhận được BOM'd. Tôi nạp 'byte []' vào 'MemoryStream' thay vào đó, và tất cả đều tốt. –

0

Ứng dụng này đã đâm với các lỗi sau: "Dữ liệu ở cấp độ gốc không hợp lệ Line 1, vị trí 1." tôi nghi ngờ bạn dữ liệu xml không có một cấp độ gốc: ví dụ:

<area id="1"> 
    <candidate id="0">dataata</candidate> 
</area> 
<area id="2"> 
    <candidate id="0">dataataa</candidate> 
</area> 

bạn cần có ít nhất một cấp độ gốc ở đầu các cấp dưới cùng. ví dụ:

<areas> 
    <area id="1"> 
    <candidate id="0">dataata</candidate> 
    </area> 
    <area id="2"> 
    <candidate id="0">dataataa</candidate> 
    </area> 
</areas> 

vì vậy hãy đặt một mẹ trên đỉnh của cấp độ của bạn, làm cho nó lớn lớn mẹ của tất cả trẻ em

+0

Dòng 1, vị trí 1 là khởi đầu của tài liệu. Nó chưa bắt đầu tìm kiếm giá trị cấu trúc và một phần tử cấp doc. –