对于这种需要,我会明确建议 XSLT,因为它以某种方式创建了 XML transformation 和 XSLT 来转换 XML 内容。
然后,我将使用样式表的 模板,该样式表旨在用作这样的字符串格式:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'>
<xsl:template match='/'>
<elements>
<xsl:apply-templates select="elements/element1" mode="%s"/>
<xsl:apply-templates select="elements/element2" mode="%s"/>
<xsl:apply-templates select="elements/element3" mode="%s"/>
<xsl:apply-templates select="elements/element4" mode="%s"/>
<xsl:apply-templates select="elements/element5" mode="%s"/>
</elements>
</xsl:template>
<xsl:template match='*' mode='normal'>
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match='*' mode='comment'>
<xsl:text disable-output-escaping="yes"><!--</xsl:text><xsl:copy-of select="."/>--<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:template>
</xsl:stylesheet>
如您所见,有两种模式:
- 如果您选择
normal,它将简单地复制节点的内容
- 如果您选择
comment,它将评论其内容
所以如果我们激活element1、element3和element5,我们样式表的真实内容将是String.format(template, "normal", "comment", "normal", "comment", "normal")
在下面的代码 sn-p 中,我使用 jcabi-xml,因为它非常易于使用,但如果您愿意,您可以随意使用其他库,XSLT 是一个标准,所以它仍然可以工作。
XML first = new XMLDocument(
"<elements>\n" +
" <element1 atribute=\"value\"/>\n" +
" <element2 atribute=\"value\"/>\n" +
" <element3 atribute=\"value\"/>\n" +
" <element4 atribute=\"value\"/>\n" +
" <element5 atribute=\"value\"/>\n" +
"</elements>"
);
String template = "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'>\n" +
" <xsl:template match='/'>\n" +
" <elements>\n" +
" <xsl:apply-templates select=\"elements/element1\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element2\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element3\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element4\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element5\" mode=\"%s\"/>\n" +
" </elements>\n" +
" </xsl:template>\n" +
" <xsl:template match='*' mode='normal'>\n" +
" <xsl:copy-of select=\".\"/>\n" +
" </xsl:template>\n" +
" <xsl:template match='*' mode='comment'>\n" +
" <xsl:text disable-output-escaping=\"yes\"><!--</xsl:text><xsl:copy-of select=\".\"/>--<xsl:text disable-output-escaping=\"yes\">></xsl:text>\n" +
" </xsl:template>\n" +
"</xsl:stylesheet>";
XML second = new XSLDocument(
String.format(template, "normal", "comment", "normal", "comment", "normal")
).transform(first);
System.out.println(second.toString());
输出:
<?xml version="1.0" encoding="UTF-8"?>
<elements>
<element1 atribute="value"/>
<!--<element2 atribute="value"/>-->
<element3 atribute="value"/>
<!--<element4 atribute="value"/>-->
<element5 atribute="value"/>
</elements>
注意:为了可读性,我格式化了输出