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行的标签.
不幸的是,这种行为是必需的,无法改变.
我认为阅读评论和未评论会使这个问题变得复杂.更简单的方法是添加属性,您可以通过该属性激活标记或停用.只要您要求将其标记为真或假,就不需要解决方法.
例如:
<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等进行解决方法.
注释是一种特殊类型的节点。您无法从/到注释/未注释状态“切换”。我在这里至少看到了太多的可能性,尽管都没有 JAXB:
with setIgnoringComments(false))如果您需要更详细的答案,请随时询问。您应该可以轻松找到每个步骤的大量文档。
您还可以使用 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)