如何在XML属性值中包含&, <, >等字符

64

我想创建一个XML文件,用来存储Java程序的结构。我已经成功解析了Java程序,并按要求创建了标签。但当我尝试在标签内包含源代码时,会遇到问题,因为Java源代码可能使用大量实体引用和保留字符,例如&<>&等。我无法创建有效的XML。

我的XML应该像这样:

<?xml version="1.0"?>
<prg name="prg_name">
  <class name= "class_name>
    <parent>parent class</parent>
      <interface>Interface name</interface>
.
.
.
      <method name= "method_name">
        <statement>the ordinary java statement</statement>
        <if condition="Conditional Expression">
          <statement> true statements </statement>
        </if>
        <else>
          <statement> false statements </statement>
        </else>
        <statement> usual control statements </statement>
 .
 .
 .
      </method>
    </class>
 .
 .
 .
 </prg>

就像这样,但是问题在于if或其他语句的条件表达式中有很多&或其他保留符号,这会阻止XML获得验证。由于所有这些数据(源代码)都是由用户提供的,我对其几乎没有控制权。转义这些字符将非常耗时。

我可以使用CDATA来转义元素文本,但不能用于包含条件表达式的属性值。我正在使用Antlr Java语法解析Java程序并获取标记的属性和内容。那么是否有任何其他解决方法呢?

2个回答

106
你必须对

进行转义。
" to  &quot;
' to  &apos;
< to  &lt;
> to  &gt;
& to  &amp;

用于生成XML格式。


如何使用加号 +? - TheLD
1
@LarsVandeDonk "+" 可以直接使用,不需要在 XML 中转义。也许你是在谈论 URL 转义? - izogfif

37

在XML属性中,你必须转义

" with &quot;
< with &lt;
& with &amp;

如果您使用双引号(")包裹属性值,例如:

<MyTag attr="If a&lt;b &amp; b&lt;c then a&lt;c, it's obvious"/>

含义标签MyTag带有属性attr和文本If a<b & b<c then a<c, it's obvious - 注意:不需要使用&apos;转义'字符。

如果您将属性值用单引号(')括起来,则应转义这些字符:

' with &apos;
< with &lt;
& with &amp;

你可以直接书写代码中的双引号 "。 在属性文本中转义>&gt;是不必要的,例如<a b=">"/>是格式良好的XML。


10
为什么XML要求在属性值中的特殊字符必须转义?只需要将双引号或单引号括起来就可以了,字符串中的其他任何内容都可以被视为内容! - Teddy
2
我猜这是为了防范糟糕的XML解析器和/或不正确的XML而采取的预防措施。例如,如果省略属性的引号(<tag attr=value></tag>)。 - izogfif
虽然我不是专家,但我认为这可能是由于最初用于定义HTML和其他类型的标记语言的SGML而采取的历史性预防措施。 - LMA1980
即使使用现代解析器,闭合标签仍然是问题所在。起始标签不会产生任何错误。 - Sorter
9
这个答案比被接受的答案更加正确,因为它提供了最小必要转义字符集合。 - TToni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接