【问题标题】:How do I include &, <, > etc in XML attribute values如何在 XML 属性值中包含 &、<、> 等
【发布时间】:2011-08-08 05:31:31
【问题描述】:

我想创建一个用于存储 Java 程序结构的 XML 文件。我能够成功解析 Java 程序并根据需要创建标签。当我尝试在我的标签中包含源代码时出现问题,因为 Java 源代码可能使用大量实体引用和保留字符,如 &amp;&lt;&gt;&amp;。我无法创建有效的 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 或其他语句的条件表达式中有很多&amp; 或其他保留符号,这会阻止XML 得到验证。由于所有这些数据(源代码)都是由用户提供的,因此我几乎无法控制它。就时间而言,逃离角色将非常昂贵。

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

【问题讨论】:

    标签: java xml entityreference xml-attribute


    【解决方案1】:

    你必须逃跑

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

    对于 xml。

    【讨论】:

    • 一个+(加号)怎么样
    • @LarsVandeDonk "+" 可以直接使用,不需要在 XML 中转义。也许您在谈论 URL 转义?
    【解决方案2】:

    在 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&lt;b &amp; b&lt;c then a&lt;c, it's obvious - 注意:无需使用&amp;apos; 转义' 字符。

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

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

    您可以按原样写"。 在属性文本中使用&amp;gt; 转义&gt; 不是必需的,例如&lt;a b="&gt;"/&gt; 是格式良好的 XML。

    【讨论】:

    • 为什么 XML 要求在属性值的情况下对引号内的特殊字符进行转义?只有 " 或 ' 需要被引用......并且该字符串中的任何其他内容都可以简单地视为内容!
    • 我想这是对编写不当的 XML 解析器和/或不正确的 XML 的预防措施。例如,如果省略了属性的引号 (&lt;tag attr=value&gt;&lt;/tag&gt;)。
    • 不是专家,但我怀疑这是历史上的预防措施,因为 SGML 最初用于定义 HTML 和其他类型的标记语言。
    • 即使使用现代解析器,结束标签也是问题所在。起始标签不会给出任何错误。
    • 这比公认的答案更正确,因为它提供了最少的必要转义集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多