Những ký tự nào tôi cần thoát trong tài liệu XML?


925

Những ký tự nào phải được thoát trong các tài liệu XML hoặc tôi có thể tìm thấy danh sách đó ở đâu?


7
Ví dụ:<company>AT&amp;T</company>
jacktrades

Xem Thoát đơn giản XML bên dưới để biết hướng dẫn ngắn gọn và dễ nhớ mà tôi đã chắt lọc từ các nguồn chính ( Ngôn ngữ đánh dấu mở rộng W3C (XML) 1.0 (Phiên bản thứ năm) ).
kjhughes

Câu trả lời:


1356

Nếu bạn sử dụng một lớp học hoặc thư viện thích hợp, họ sẽ thực hiện việc thoát hiểm cho bạn. Nhiều vấn đề XML được gây ra bởi nối chuỗi.

Ký tự thoát XML

Chỉ có năm:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

Thoát ký tự phụ thuộc vào nơi sử dụng ký tự đặc biệt.

Các ví dụ có thể được xác thực tại Dịch vụ xác thực đánh dấu W3C .

Bản văn

Cách an toàn là thoát khỏi tất cả năm ký tự trong văn bản. Tuy nhiên, ba nhân vật ", '>nhu cầu không được thoát trong văn bản:

<?xml version="1.0"?>
<valid>"'></valid>

Thuộc tính

Cách an toàn là thoát tất cả năm ký tự trong thuộc tính. Tuy nhiên, >nhân vật không cần phải thoát trong các thuộc tính:

<?xml version="1.0"?>
<valid attribute=">"/>

'tự không cần được thoát trong các thuộc tính nếu dấu ngoặc kép là ":

<?xml version="1.0"?>
<valid attribute="'"/>

Tương tự, "không cần phải thoát trong các thuộc tính nếu dấu ngoặc kép là ':

<?xml version="1.0"?>
<valid attribute='"'/>

Bình luận

Tất cả năm ký tự đặc biệt không được thoát trong các bình luận:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Tất cả năm ký tự đặc biệt không được thoát trong các phần CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Hướng dẫn xử lý

Tất cả năm ký tự đặc biệt không được thoát trong hướng dẫn xử lý XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML so với HTML

HTML có bộ mã thoát riêng bao gồm nhiều ký tự hơn.


33
@Pacerier, tôi xin bạn đừng viết mã thoát XML / HTML của riêng bạn. Sử dụng chức năng thư viện hoặc bạn bị ràng buộc bỏ lỡ một trường hợp đặc biệt.
Jason

5
Ngoài ra, để ngắt dòng, bạn cần sử dụng & # xA; & # xD; và & # x9; cho tab, nếu bạn cần các ký tự này trong một thuộc tính.
radistao

78
Nếu bạn định thực hiện Tìm / Thay thế những thứ này, chỉ cần nhớ thực hiện & amp; thay thế trước những người khác.
Doug

2
@Doug Tôi vừa mới đề cập đến điều tương tự chính xác - nếu không thì tất cả các nhân vật được thay thế khác sẽ bị hỏng, và những thứ như thế &quot;sẽ được đổi thành&amp;quot;
Jerry Dodge

5
Từ Wikipedia: "Tất cả các ký tự Unicode được phép có thể được biểu diễn bằng tham chiếu ký tự số." Vì vậy, có rất nhiều hơn 5.
Tim Cooper

93

Có lẽ điều này sẽ giúp:

Danh sách các tham chiếu thực thể ký tự XML và HTML :

Trong các tài liệu SGML, HTML và XML, các cấu trúc logic được gọi là dữ liệu ký tự và giá trị thuộc tính bao gồm các chuỗi ký tự, trong đó mỗi ký tự có thể biểu hiện trực tiếp (đại diện cho chính nó) hoặc có thể được biểu thị bằng một loạt các ký tự được gọi là tham chiếu ký tự, trong đó có hai loại: tham chiếu ký tự số và tham chiếu thực thể ký tự. Bài viết này liệt kê các tham chiếu thực thể ký tự hợp lệ trong các tài liệu HTML và XML.

Bài viết đó liệt kê năm thực thể XML được xác định trước sau:

quot  "
amp   &
apos  '
lt    <
gt    >

73

Theo thông số kỹ thuật của World Wide Web Consortium (w3C), có 5 ký tự không được xuất hiện ở dạng chữ của chúng trong tài liệu XML , ngoại trừ khi được sử dụng làm dấu phân cách đánh dấu hoặc trong một nhận xét, hướng dẫn xử lý hoặc phần CDATA . Trong tất cả các trường hợp khác, các ký tự này phải được thay thế bằng cách sử dụng thực thể tương ứng hoặc tham chiếu số theo bảng sau:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Lưu ý rằng các thực thể đã nói ở trên cũng có thể được sử dụng trong HTML, ngoại trừ & apos; , đã được giới thiệu với XHTML 1.0 và không được khai báo trong HTML 4. Vì lý do này và để đảm bảo tính tương thích retro, đặc tả XHTML khuyên bạn nên sử dụng & # 39; thay thế.


14
XML xác định trước năm thực thể đó, nhưng hoàn toàn KHÔNG xác định rằng bạn không thể sử dụng bất kỳ ký tự nào trong năm ký tự đó ở dạng nghĩa đen của chúng. <và & phải được trốn thoát ở mọi nơi (trừ CDATA). "và 'chỉ phải thoát trong các giá trị thuộc tính và chỉ khi ký tự trích dẫn tương ứng giống nhau. Và> không bao giờ thực sự phải thoát.
Shaun McCance

3
Như đã viết ở trên, <> "& 'không phải thoát khi được sử dụng làm dấu phân cách đánh dấu hoặc trong một nhận xét, hướng dẫn xử lý hoặc phần CDATA. Tức là khi bạn sử dụng <> làm thẻ XML, bạn không thoát khỏi thẻ XML Điều tương tự cho một nhận xét (bạn có thoát khỏi một & trong một dòng nhận xét của tệp XML không? Bạn không cần và XML của bạn vẫn hợp lệ nếu bạn không). Điều này được quy định rõ ràng trong các đề xuất chính thức cho XML của W3C .
Albz

7
@ShaunMcCance >phải được thoát nếu nó đi theo ]]nội dung, trừ khi nó dự định là một phần của ]]>dấu phân cách chỉ ra phần cuối của phần CDATA.
Lee D

2
Không phải là một kẻ phá hoại, nhưng @Albz không chính xác khi nói rằng những nhân vật này PHẢI được lôi kéo vào nội dung. Xem phần 2.4 tại w3.org/TR/REC-xml/#NT-CharData . Phiên bản TL; DR của nội dung đó là trong nội dung phần tử chardata, & amp; và & lt; phải luôn luôn được lôi kéo. & Gt; ký tự CÓ THỂ được kích hoạt, mặc dù PHẢI là khi xuất hiện trong chuỗi ký tự chữ]]> bởi vì nếu không, điều đó sẽ được đọc là kết thúc một phần CDATA. Đối với trích dẫn đơn và trích dẫn kép, bạn có thể thoát nếu bạn muốn. Đó là nó, cho chardata bên trong các yếu tố. Các thành phần khác của XML có các quy tắc khác.
skye --- đội trưởng

52

Thoát ký tự là khác nhau cho các thẻ và thuộc tính.

Đối với thẻ:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Đối với thuộc tính:

" &quot;
' &apos;

Từ dữ liệu nhân vật và đánh dấu :

Ký tự dấu và (và) và dấu ngoặc góc trái (<) không được xuất hiện ở dạng nghĩa đen của chúng, ngoại trừ khi được sử dụng làm dấu phân cách đánh dấu hoặc trong một nhận xét, hướng dẫn xử lý hoặc phần CDATA. Nếu chúng cần ở nơi khác, chúng phải được thoát bằng cách sử dụng tham chiếu ký tự số hoặc chuỗi "& amp;" và "& lt;" tương ứng. Dấu ngoặc vuông (>) có thể được biểu diễn bằng chuỗi "& gt;" và phải, để tương thích, phải được thoát bằng cách sử dụng "& gt;" hoặc tham chiếu ký tự khi xuất hiện trong chuỗi "]]>" trong nội dung, khi chuỗi đó không đánh dấu sự kết thúc của phần CDATA.

Để cho phép các giá trị thuộc tính chứa cả dấu ngoặc đơn và dấu ngoặc kép, ký tự dấu nháy đơn hoặc dấu ngoặc đơn (') có thể được biểu diễn dưới dạng "& apos;" và ký tự trích dẫn kép (") là" & quot; ".


Điều này ngụ ý rằng đối với các thuộc tính, chỉ cần trích dẫn các trích dẫn, nhưng đó là ngoài ba ký tự khác
eug

40

Câu trả lời mới, đơn giản cho một câu hỏi cũ, thường được hỏi ...

Thoát XML đơn giản hóa (ưu tiên, hoàn thành 100%)

  1. Luôn luôn (90% quan trọng cần nhớ)

    • Thoát <như &lt;trừ khi <bắt đầu a <tag/>.
    • Thoát &như &amp;trừ khi &bắt đầu một &entity;.
  2. Giá trị thuộc tính (9% quan trọng cần nhớ)

    • attr=" 'Báo giá đơn 'là ok trong dấu ngoặc kép."
    • attr=' "Báo giá đôi "là ok trong dấu ngoặc đơn.'
    • Thoát "như &quot;'như &apos;khác.
  3. Nhận xét , CDATAHướng dẫn xử lý (0,9% quan trọng cần nhớ)

    • <!--Trong các bình luận --> không có gì phải thoát nhưng không có --chuỗi nào được phép.
    • <![CDATA[Trong CDATA, ]]> không có gì phải thoát, nhưng không ]]>cho phép chuỗi.
    • <?PITargetTrong PI ?> không có gì phải thoát, nhưng không có ?>chuỗi nào được phép.
  4. Esoterica (0,1% quan trọng cần nhớ)

    • Thoát ]]>như ]]&gt;trừ khi ]]>kết thúc một phần CDATA.
      (Quy tắc này áp dụng cho dữ liệu ký tự nói chung - ngay cả bên ngoài phần CDATA.)

Một quy tắc khác đáng chú ý: ]]>phải được thoát như ]]&gt;, ngay cả khi không nằm trong phần CDATA. Cách dễ nhất để đạt được điều đó có thể là luôn luôn trốn thoát >như &gt;.
Michael Kay

Cảm ơn, @MichaelKay. Tôi đã kết hợp ghi chú hữu ích của bạn về ]]> nhưng đã chọn chuyển nó thành bí truyền thay vì gợi ý rằng > luôn luôn được thoát (mà bạn không cần phải như bạn biết). Mục tiêu của tôi ở đây là làm cho các quy tắc thoát XML dễ nhớ chính xác 100% .
kjhughes

Các câu trả lời ở trên bao gồm chấp nhận một đề cập đến tất cả năm ký tự nên được thoát bên trong các thuộc tính. Bạn có bất kỳ tham chiếu nào về tiêu chuẩn XML để phản hồi lại những gì bạn đang nói vì câu trả lời của bạn có vẻ hợp lý không?
Roman Susi

1
@RomanSusi: Có, nhiều câu trả lời khác có lỗi hoặc quá mức ("Cách an toàn ...") dựa trên tin đồn, giải thích sai hoặc hiểu sai về BNF XML chính thức. Câu trả lời của tôi là (a) 100% được chứng minh bởi Khuyến nghị XML của W3C; xem nhiều tài liệu tham khảo được liên kết đến BNF chính thức và (b) được tổ chức theo một tiến trình ngắn gọn, hợp lý và dễ nhớ của những yêu cầu đó.
kjhughes

@RomanSusi: Tuyên bố cụ thể rằng "tất cả năm ký tự nên được thoát bên trong các thuộc tính" là hướng dẫn cẩu thả không được hỗ trợ bởi quy tắc BNF chính thức AttValueđược trích dẫn trong câu trả lời của tôi thông qua liên kết trên 2. Giá trị thuộc tính .
kjhughes

25

Ngoài năm ký tự thường được biết đến [<,>, &, "và '], tôi cũng sẽ thoát ký tự tab dọc (0x0B). Đó là UTF-8 hợp lệ, nhưng không hợp lệ XML 1.0 và thậm chí nhiều thư viện (bao gồm thư viện libxml2 có tính di động cao (ANSI C) ) bỏ lỡ nó và âm thầm xuất ra XML không hợp lệ.


11

Được rút ngắn từ: XML, Thoát

Có năm thực thể được xác định trước:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Tất cả các ký tự Unicode được phép có thể được biểu diễn bằng tham chiếu ký tự số." Ví dụ:

&#20013;

Hầu hết các ký tự điều khiển và các phạm vi Unicode khác được loại trừ một cách cụ thể, nghĩa là (tôi nghĩ) chúng không thể xảy ra hoặc thoát hoặc trực tiếp:

Các ký tự hợp lệ trong XML


3

Nó phụ thuộc vào ngữ cảnh. Đối với nội dung, đó là <& , và ]]> (mặc dù một chuỗi gồm ba thay vì một ký tự).

Đối với các giá trị thuộc tính, đó là < , & , "' .

Đối với CDATA, đó là ]]> .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.