删除保留给定节点的XML内容(Java解析器)

时间:2011-10-24 03:34:23

标签: java xml

在下面的XML示例中,使用java解析器如何将内容保留在标记AND后面的中心并删除其他所有内容? 当标签后跟除中心之外的其他标签时,标签可能有其他实例,并且必须丢弃这些标签。

<xml>
    <A> 
        <B>
        .
        .
        .

            <parameter>
                <parameterid>center</parameterid>
                <name>Center</name>
                <keyframe>
                    <when>1</when>
                    <value>
                        <horiz>100</horiz>
                        <vert>100</vert>
                    </value>
                </keyframe>
                <keyframe>
                <when>2</when>
                    <value>
                        <horiz>150</horiz>
                        <vert>150</vert>
                    </value>
                </keyframe>
            </parameter>
            <parameter>
                ...
            </parameter>
            <parameter>
                ...
            </parameter>
        .
        .
        .
        </B>
    </A>
</xml>

所以输出看起来像:

<parameter>
    <parameterid>center</parameterid>
    <name>Center</name>
    <keyframe>
        <when>1</when>
        <value>
            <horiz>100</horiz>
            <vert>100</vert>
        </value>
    </keyframe>
    <keyframe>
    <when>2</when>
        <value>
            <horiz>150</horiz>
            <vert>150</vert>
        </value>
    </keyframe>
</parameter>

请指教。谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用Java Regex删除不需要的内容,然后仅解析所需的部分f.e。

String sourceXML = readFileToString("source.xml")
final Pattern pattern = Pattern.compile(".*(<parameter>.+</parameter>).*",Pattern.DOTALL);
Matcher matcher = pattern.matcher(sourceXML);
if (matcher.find()) {
   String xmlToParse = matcher.group(0);
   someDomOrSaxParser.parseFromString(xmlToParse)
}else 
   System.out.println("NO MATCH");

答案 1 :(得分:0)

这对于XSLT样式表来说是一个很好的工作。

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:template>

  <xsl:template match="parameter[parameterid='center']">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

应用于问题中的输入,产生以下输出:

<parameter>
   <parameterid>center</parameterid>
   <name>Center</name>
   <keyframe>
      <when>1</when>
      <value>
         <horiz>100</horiz>
         <vert>100</vert>
      </value>
   </keyframe>
   <keyframe>
      <when>2</when>
      <value>
         <horiz>150</horiz>
         <vert>150</vert>
      </value>
   </keyframe>
</parameter>

如果您对使用Java中的XSLT有任何疑问,请查看this question