使用JAXB处理XML注释

Vio*_*ian 7 java xml jaxb xml-parsing

我需要读取一个XML文件,并根据某些条件对其中的某些元素进行注释或取消注释.该文件如下所示:

<elements>
    <!-- <element1 atribute="value"/> -->
    <!-- <element2 atribute="value"/> -->
    <!-- <element3 atribute="value"/> -->
    <!-- <element4 atribute="value"/> -->
    <!-- <element5 atribute="value"/> -->
</elements>
Run Code Online (Sandbox Code Playgroud)

如果我想激活element1,element3并且element5该文件应如下所示:

<elements>
    <element1 atribute="value"/>
    <!-- <element2 atribute="value"/> -->
    <element3 atribute="value"/>
    <!-- <element4 atribute="value"/> -->
    <element5 atribute="value"/>
</elements>
Run Code Online (Sandbox Code Playgroud)

换句话说,我正在寻找一种方法来添加或删除<!-- -->符合条件的每个XML行的标签.
不幸的是,这种行为是必需的,无法改变.

Pra*_*ngh 5

我认为阅读评论和未评论会使这个问题变得复杂.更简单的方法是添加属性,您可以通过该属性激活标记或停用.只要您要求将其标记为真或假,就不需要解决方法.

例如:

<elements>
    <!-- <element1 atribute="value"/> -->
    <!-- <element2 atribute="value"/> -->
    <!-- <element3 atribute="value"/> -->
    <!-- <element4 atribute="value"/> -->
    <!-- <element5 atribute="value"/> -->
</elements>
Run Code Online (Sandbox Code Playgroud)

可以转化为.

<elements>
    <element1 atribute="value" isActive="false"/>
    <element2 atribute="value" isActive="false"/>
    <element3 atribute="value" isActive="false"/>
    <element4 atribute="value" isActive="false"/>
    <element5 atribute="value" isActive="false"/>
</elements>
Run Code Online (Sandbox Code Playgroud)

同样,下面

<?xml version="1.0" encoding="UTF-8"?>
<elements>
    <element1 atribute="value"/>
    <!--<element2 atribute="value"/>-->
    <element3 atribute="value"/>
    <!--<element4 atribute="value"/>-->
    <element5 atribute="value"/>
</elements>
Run Code Online (Sandbox Code Playgroud)

可以转化为.

<elements>
    <element1 atribute="value" isActive="true"/>
    <element2 atribute="value" isActive="false"/>
    <element3 atribute="value" isActive="true"/>
    <element4 atribute="value" isActive="false"/>
    <element5 atribute="value" isActive="true"/>
</elements>
Run Code Online (Sandbox Code Playgroud)

这可以是解决此问题的优化方法.现在,您可以使用JAXB并将元素标记为活动或非活动,而不是注释和取消注释.

如果这不能让您的生活更轻松,那么总是使用正则表达式,xslt等进行解决方法.


Kea*_*eks 2

注释是一种特殊类型的节点。您无法从/到注释/未注释状态“切换”。我在这里至少看到了太多的可能性,尽管都没有 JAXB:

DOM方式:

  1. 使用您选择的 DOM 解析器解析 XML 文件 ( with setIgnoringComments(false))
  2. 从每个节点获取原始数据(参见Comment . getData()
  3. 从字符串创建一个新节点
  4. 将“comment”节点替换为新节点(请参阅Node.replaceChild

如果您需要更详细的答案,请随时询问。您应该可以轻松找到每个步骤的大量文档。

XSLT 方式:

您还可以使用 XSLT,正如 @Xavier 在评论中指出的那样。这里的问题是,纯粹的匹配和替换会将注释的内容输出为未转义文本,并且不会将其识别为真正的 XML 数据。我想你可以使用 saxon 来规避这个问题,比如:

<xsl:template match="comment()[contains(., 'your conditional match')]">
    <xsl:variable name="comment" select="saxon:parse(.)" as="document-node()"/>
    <xsl:copy-of select="$comment"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)