2010-06-24 53 views
5

Tôi có một chương trình đang tạo Tệp Xml từ dữ liệu ra khỏi cơ sở dữ liệu. Trong mã ngắn nó như sau:ký tự không hợp lệ trong tài liệu xml

string dsn = "a db connection string"; 
XmlDocument d = new XmlDocument(); 
using (SqlConnection con = new SqlConnection(dsn)) { 
    con.Open(); 
    string sql = "select id as Id, comment as Comment from Test where ... "; 
    using (SqlCommand cmd = new SqlCommand(sql, con)) { 
     DataSet ds = new DataSet("EXPORT"); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(ds, "Test"); 
     d.LoadXml(ds.GetXml()); 
    } 
} 
d.Save(@"c:\test.xml"); 

Khi tôi có một cái nhìn tại xml nộp nó chứa các nhân vật không hợp lệ & # x 1 A;

<EXPORT> 
    <Test> 
    <Id>2</Id> 
    <Comment> Keyboard NB&#x1A;5 linked</Comment> 
    </Test> 
</EXPORT> 

file xml này không thể được mở bằng trình duyệt firefox nói nhân vật không hợp lệ ...

Đó Entity được dành riêng trong ISO 8859-1 và CP1252 và không nên được trả lại bởi trình duyệt. Nhưng tại sao XmlDocument đầu ra xml không thể phân tích cú pháp là hợp lệ - hoặc nó là một tài liệu xml hợp lệ mà không thể được phân tích cú pháp bởi Trình duyệt hoặc được nhập bởi Excel và ... Có cách nào dễ dàng để loại bỏ dữ liệu đó ký tự không hợp lệ hoặc mã hóa chúng theo cách mà Trình duyệt không gặp sự cố với nó?

Rất cám ơn ý kiến ​​của bạn và Tipps

+0

Tôi đã có cùng một vấn đề chính xác với các phương thức XML khác nhau cho các đối tượng System.Data. Tôi không chắc chắn những gì khác những phương pháp sẽ làm mặc dù. Thay thế của họ là để loại bỏ các nhân vật hoặc ném một ngoại lệ. –

Trả lời

3

Không phải tất cả các ký tự đều thể hiện trong XML.

Trong XML 1.0, không thể sử dụng các ký tự có giá trị nhỏ hơn 0x20, ngoại trừ TAB (0x09), LF (0x0A) và CR (0x0D).

Trong XML 1.1, bất kỳ thứ gì ngoại trừ NUL (0x00) đều có thể được sử dụng.

Nếu bạn có tùy chọn để sử dụng XML 1.1, chương trình tiếp nhận hỗ trợ XML 1.1 (không nhiều làm), sau đó bạn có thể thoát khỏi 0x1A như &#26; hoặc &#x1A;.

Bao gói trong CDATA cũng không phải là giải pháp; CDATA chỉ là một cách thuận tiện để thoát khỏi các nhóm ký tự khác với tiêu chuẩn &-cơ chế.

Nếu không, bạn sẽ cần xóa nó trước khi tuần tự hóa.

+0

xin lỗi vì đã trả lời khá muộn cho câu hỏi cũ đó - tôi đã xóa các ký tự trước khi đăng chuỗi ... Thx –

0

Hãy nhìn vào câu trả lời này để xem nếu nó giúp:

.NET DataSet.GetXml() - what's the default encoding?

+0

Cảm ơn bạn đã gửi mã, nhưng chuỗi tôi nhận được với ds.GetXml() là nội bộ trong unicode (utf-16) Tôi nghĩ và khi viết vào textfile mà không thay đổi mã hóa mọi thứ sẽ ổn? –

0

Tôi nghĩ rằng bạn đang xử lý một Control-Z (cuối của tệp văn bản) ký tự. Điều này có thể không?

+0

Hm google cho biết "dành riêng không sử dụng" cho iso8859-1 và cp1252 superset của nó có thể nó là kết thúc đánh dấu tập tin, ... nhưng nội dung trong DB là hộp đen cho tôi, vì vậy tôi không có khả năng lọc cho đầu vào sạch vào DB bảng ... –

1

Tôi đã chạy vào điều này một vài lần khi tạo/thao tác XML từ dữ liệu SQL.

Nhưng tại sao XmlDocument đầu ra xml mà không thể được phân tích cú pháp là hợp lệ - hoặc là nó một tài liệu xml hợp lệ mà chỉ là không thể được phân tích bởi trình duyệt, nhập khẩu của Excel và vân vân

Các XmlDocument doesn' t thực hiện bất kỳ xác nhận trên dữ liệu mà bạn gửi nó, nó để lại cho bạn (nhà phát triển). Tài liệu XML này sẽ không hợp lệ trong hầu hết mọi thứ sử dụng XML (nhưng tôi có thể sai về điều đó ... bạn luôn có thể kiểm tra nó: P)

Hầu như mỗi lần tôi gặp vấn đề này, tôi đã sử dụng xong thay thế dữ liệu XML vi phạm bằng ký tự thích hợp (nếu có) hoặc chỉ loại bỏ nó.

Bạn cũng có thể thử đặt xml của bạn bên trong một khối CDATA, nhưng điều đó sẽ sưng lên các tập tin một chút (không chắc chắn lớn như thế nào toàn bộ tập tin của bạn sẽ được)

-1

Đảm bảo thoát khỏi các thực thể XML, ví dụ: & => &amp; Nếu không, hãy dán dữ liệu vào CDATA http://en.wikipedia.org/wiki/CDATA

+0

Ngay cả khi là một thực thể, ' ', nó vẫn không hợp lệ. –

+0

Hai vấn đề. 1. Các thực thể XML và HTML là những thứ khác nhau. Theo mặc định, XML chỉ hỗ trợ 5 thực thể, phần còn lại có thể được định nghĩa bởi một DTD.  là một thực thể HTML, không phải là một thực thể XML. Vì vậy,  sẽ không hoạt động trong XML, bạn cần viết nó là . Vấn đề 2. như câu trả lời ở trên được đề xuất, không thể chèn các ký tự không in được vào XML. Vì vậy, bạn sẽ cần phải thoát khỏi một cái gì đó như  đến & # 21; trước khi nó được phân tích bằng XML. –

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