java - 使用 SAX 解析器拆分 XML

标签 java xml xpath sax

我有以下 xml 文件。

<Engineers>
    <Engineer>
        <Name>JOHN</Name>
        <Position>STL</Position>
        <Team>SS</Team>
    </Engineer>
    <Engineer>
        <Name>UDAY</Name>
        <Position>TL</Position>
        <Team>SG</Team>
    </Engineer>
    <Engineer>
        <Name>INDRA</Name>
        <Position>Director</Position>
        <Team>PP</Team>
    </Engineer>
</Engineers>

当 Xpath 被指定为 Engineers/Enginner 时,我需要将此 xml 拆分为更小的 xml 字符串。

较小的 xml 字符串如下

<Engineers>
    <Engineer>
        <Name>INDRA</Name>
        <Position>Director</Position>
        <Team>PP</Team>
    </Engineer>
</Engineers>

<Engineers>
    <Engineer>
        <Name>JOHN</Name>
        <Position>STL</Position>
        <Team>SS</Team>
    </Engineer>
</Engineers>

到目前为止,我已经使用 SAX 实现了以下功能,我们可以获取 XML 中的元素,但不是我想要的。我该如何继续?

public class ReadSAX
{
    public static void main( String[] args )
    {
        try {

              SAXParserFactory factory = SAXParserFactory.newInstance();
              SAXParser saxParser = factory.newSAXParser();

              DefaultHandler handler = new DefaultHandler() {

   public void startElement(String uri, String localName,
                    String qName, Attributes attributes)
                    throws SAXException {

                  System.out.println("Start Element :" + qName);



                public void endElement(String uri, String localName,
                        String qName)
                        throws SAXException {

                      System.out.println("End Element :" + qName);

                }

                public void characters(char ch[], int start, int length)
                    throws SAXException {

                  System.out.println(new String(ch, start, length));


                 }

              };

              File file = new File("c:\\file.xml");
              InputStream inputStream= new FileInputStream(file);
              Reader reader = new InputStreamReader(inputStream,"UTF-8");

              InputSource is = new InputSource(reader);
              is.setEncoding("UTF-8");

              saxParser.parse(is, handler);


            } catch (Exception e) {
              e.printStackTrace();
            }

    }
}

最佳答案

为什么要使用如此低级的编码方法?

在 XSLT 2.0 中,这很简单

<xsl:template match="/">
  <xsl:for-each select="Engineers/Engineer">
    <xsl:result-document select="{position()}.xml">
      <Engineers>
        <xsl:copy-of select="."/>
      </Engineers>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template> 

如果这需要太多内存,请使用流式 XSLT 3.0 处理器来解决问题。

关于java - 使用 SAX 解析器拆分 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511547/

相关文章:

java - 用 Java 8 Streams 替换传统的 newForLoop

Mac OS Lion 上使用 PowerPC JavaApplicationStub 的 Java 应用程序

java - 单击注销按钮终止 session 并重定向到登录页面

java - Netbeans persistence.xml - 持久单元路径的定义

xpath - 使用 JMeter 中的 XPath 查询从 HTML 中的选择元素中提取值

java - 如何通过XPath从HTML中提取字符串到Java中?

XPath bool 值 'or'

java - 如何从数据库中获取电子邮件和密码?我无法在 Spring security 中验证用户

java - 在 java 中禁用唯一分区属性模式验证

java - web.xml 忽略主 JSP 文件