2008-10-16 77 views
10

Tôi đang tạo hệ thống điều hướng bên trái sử dụng xml và xsl. Mọi thứ đã diễn ra tuyệt vời cho đến khi tôi cố gắng sử dụng một ký tự đặc biệt trong tài liệu xml của mình. Tôi đang sử dụng » và tôi gặp phải lỗi thứ.Ký tự đặc biệt trong XML

lý do: Tham chiếu đến thực thể chưa xác định 'raquo'.
mã lỗi: -1072898046

Làm cách nào để thực hiện công việc này?

Trả lời

0

Bạn đang sử dụng biểu tượng »trực tiếp hoặc bạn định nghĩa nó là & raquo; ? Nếu bạn đang sử dụng biểu tượng thoát, bạn đã quên dấu chấm phẩy chưa?

+0

tôi xác định nó như là ». Kiểm tra lại và không, tôi không quên dấu chấm phẩy vừa bỏ qua khi tôi dán vào đây. – BillZ

5

bạn có chỉ định loại tài liệu cho tệp của mình không?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

Tôi nghĩ bạn có thể gặp phải các lỗi như vậy nếu bạn quên chỉ định.

Đôi khi các thực thể hoạt động nếu bạn chỉ định chúng theo số thay vì tên.

&#187; &#171; instead of &raquo; and &laquo; 
+0

đó là một DOCTYPE HTML. –

+0

Không, đó là một Doctype XHTML. XHTML là một ứng dụng XML và nó định nghĩa '»'. – Quentin

20

Bạn đang cố gắng sử dụng một tài liệu không phải HTML hoặc không phải XHTML. Các thực thể này được khai báo trong tài liệu của Document Type Definition (DTD).

Bạn nên sử dụng phiên bản Unicode số entity reference. Ví dụ, trong trường hợp của &raquo; bạn nên sử dụng &#187;

Ngoài ra, bạn có thể define them in your XML document's DTD:

<!ENTITY entity-name "entity-value"> 
<!ENTITY raquo "&#187;"> 

Ngược lại, nếu tài liệu của bạn là UTF-8, tôi tin rằng bạn chỉ có thể sử dụng ký tự thực tế trực tiếp trong tài liệu XML của bạn.

» 
+2

Chắc chắn sử dụng các ký tự unicode hoặc tham chiếu thực thể unicode nếu bạn có thể.Các tham chiếu ký tự được đặt tên cần tránh trong XML. –

+1

Hoàn toàn có thể là OP không có DTD cho XML của mình. Thậm chí sau đó, câu trả lời của bạn có thể được sử dụng bên trong một tập hợp con bên trong nếu người dùng muốn. Tuy nhiên, bạn nói đúng là câu trả lời đơn giản là UTF-8 và chỉ sử dụng ký tự. –

1

Đây là vấn đề vì không phải tất cả thực thể HTML là thực thể XML. Bạn có thể nhập các DTD của HTML vào tài liệu của bạn như Pat gợi ý, hoặc làm một trong các cách sau:

Thay thế tất cả các lần xuất hiện của các ký tự đặc biệt với mã đơn vị số:

&raquo; becomes &#187; 

Quấn tất cả các lần xuất hiện của các ký tự đặc biệt trong một CDATA Tag

<![CDATA[&raquo;]]> 

Xác định entitys ở phía trên cùng của tài liệu của bạn

<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "&#187;"> ]> 
0

Joe

Khi tôi sử dụng phiên bản unicode hiển thị hình vuông.

Đặt phép chiếu đối tượng vào tài liệu xml tạo "Không thể khai báo DTD bên ngoài DTD". lỗi. Tôi cho rằng điều này được mong đợi.

Khi tôi sử dụng '' để bao gồm dtd bên ngoài nó dường như không có bất kỳ ảnh hưởng nào.

Tôi tự hỏi nếu đây có thể là sự cố máy chủ. Tôi đang phát triển địa phương này và sử dụng Máy chủ Web cho Trẻ em.

+1

nếu bạn nhận được hình vuông, sau đó bạn không khai báo mã hóa đúng hoặc có mã hóa sai của tệp. Đảm bảo bạn luôn sử dụng UTF-8 và nếu có thể, hãy gửi tiêu đề HTTP Kiểu nội dung: application/xml; charset = UTF-8. Nếu không thể, hãy thêm Vào tài liệu. – Kornel

3

Bạn không cần khai báo một thực thể trong DTD của mình hoặc thậm chí sử dụng một DTD. Có thể bạn không cần sử dụng biểu diễn Unicode của ký tự. Bạn chắc chắn không cần sử dụng phần CDATA.

Những gì bạn cần làm là sử dụng DOM để tạo XML của bạn thay vì cố gắng xây dựng nó bằng thao tác chuỗi. DOM sẽ khắc phục sự cố này cho bạn.

Trong C#, mã này:

XmlDocument d = new XmlDocument(); 
d.LoadXml("<foo/>"); 
char c = (char)187; 
d.DocumentElement.InnerText = "Here's that character: " + c; 
Debug.WriteLine(d.OuterXml); 
d.DocumentElement.InnerText = "Here it is as an HTML entity: &raquo;"; 
Debug.WriteLine(d.OuterXml); 

sản xuất sản lượng này:

<foo>Here's that character: »</foo> 
<foo>Here it is as an HTML entity: &amp;raquo;</foo> 

Như bạn có thể nhìn thấy từ ví dụ đầu tiên, nhân vật » là hoàn toàn hợp pháp trong văn bản XML. Nhưng tôi không nghĩ rằng bạn đang cố gắng đại diện cho nhân vật đó.

Tôi nghĩ bạn đang cố gắng làm những gì trong ví dụ thứ hai, dựa trên thông báo lỗi mà bạn đã báo cáo. Bạn đang cố gắng đại diện cho chuỗi ký tự &raquo;. Cách thích hợp để biểu diễn chuỗi ký tự đó trong văn bản XML là bằng cách thoát khỏi dấu và; do đó: &amp;raquo;.

Vì vậy, nếu bạn phải sử dụng thao tác chuỗi để tạo XML của mình, chỉ cần đảm bảo rằng bạn thoát khỏi bất kỳ ký hiệu nào trong dữ liệu nguồn của mình. Không tin tưởng vào vấn đề này, nhưng nếu bạn đang sử dụng DOM, điều này sẽ được thực hiện tự động cho bạn.

Một điều khác. Rất có thể trong câu hỏi ban đầu của bạn, giờ đây đã đọc "Tôi đang sử dụng» ", những gì bạn thực sự đã nhập được nhập là" Tôi đang sử dụng & raquo; ". Tuy nhiên, bài đăng thực tế không giống như vậy. Nếu bạn cần phải đại diện cho văn bản theo nghĩa đen trong markdown, kèm theo nó trong backticks; nếu không, các thực thể HTML sẽ được chuyển đổi thành biểu diễn ký tự của chúng khi bài đăng được hiển thị.

+0

Tôi tự hỏi tại sao nó đã được downvoted. Đó là một câu trả lời hoàn toàn đúng. – bortzmeyer

0

chỉ cần thay thế thực thể HTML của bạn &raquo; bằng tham chiếu số &#187; vốn tốt trong bất kỳ XML và HTML nào.

0

tôi thấy mình googling để biết như vậy rất nhiều, vì vậy quyết định gửi một ma trận trên trang web của riêng tôi với mục đích đơn giản một cách nhanh chóng là có thể làm một tra cứu:

http://martinkool.com/characters

Sử dụng & # ...; hình thức thực sự.

0

Nếu bạn muốn tài liệu đầu ra để chứa các thực thể HTML tên &raquo; chứ không phải là tài liệu tham khảo số, thêm các yếu tố sau đây để stylesheet của bạn (XSLT2.0 chỉ):

<xsl:output use-character-maps="raquo.ent"/> 
<xsl:character-map name="raquo.ent"> 
    <xsl:output-character character="&#187;" string="&amp;raquo;"/> 
</xsl:character-map> 
Các vấn đề liên quan