2011-04-18 59 views
25

我想创建一个将用于存储Java程序结构的XML文件。我能够成功解析Java程序并根据需要创建标签。由于Java源代码可能使用大量实体引用和保留字符,如&,<,>,&,所以当我试图将源代码包含在我的标记中时会出现问题。我无法创建有效的XML。如何在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程序并获取标签的属性和内容。那么是否还有其他解决方法?

回答

48

你将不得不逃离

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

的XML。

+0

+ +(加号) – 2017-03-15 15:57:48

+1

@LarsVandeDonk“+”可以按照原样行,不需要用XML转义它。也许你在谈论URL转义? – izogfif 2017-07-03 17:48:01

7

在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。

+5

为什么XML要求引号内的特殊字符在属性值的情况下被转义?只有“或”需要被引用......并且该字符串内的任何内容都可以被简单地视为内容! – Teddy 2016-04-16 11:13:52

+1

我想这是对写得不好的XML解析器和/或不正确的XML的预先警告。例如,如果引号属性被省略('')。 – izogfif 2016-09-20 14:22:49

+0

不是专家,但我会怀疑这是由于SGML最初用于定义HTML和其他类型标记语言的历史防范 – LMA1980 2016-11-24 04:10:48

相关问题