Java技巧:快速解析XML

ZDNet软件频道 时间:2002-12-24 作者:BUILDER.COM |  我要评论()
本文关键词:javatips
XML解析可以说是件挺麻烦的事情。然而,如果把XML单纯地看成是格式化串,事情会要简单一些。

XML解析可以说是件挺麻烦的事情。不管是采用DOM或者SAX,或者采用象JDOM或Dom4J那样的封装器生成全部代码来进行简化,你都经常要面对烦人的工作。然而,如果把XML单纯地看成是格式化串,事情会要简单一些。






假设我们有一个FactoryMethod类,而手边有一大块XML内容。这个类要创建一个基于XML内容中<command> 标记的XmlCommandFactory对象。而XmlCommandFactory希望有一个名为XmlSendCommand的类,具体参见下面的xml内容:

<?xml
version="1.0" encoding="UTF-8"?>
<command>
  <type>Send</type>
  <message>
  ... megabytes of text ...
  </message>
</command>

与其采用一个完整的XML解析器,还不如采用下面的方式:

String type = XmlStrings.getContent(message, "type"); 

最简单的实现方式如下:

static public String getContent(String xml, String tag) {
    String openTag = "<"+tag;
    String closeTag = "</"+tag+">";

    int startIdx = -1;
    while( (startIdx = xml.indexOf(openTag)) != -1) {
        char next = xml.charAt(startIdx + tag.length( ) + 1);
        if( (next == '>') || Character.isWhitespace(next) ) {
            break;
        }
    }
    if(startIdx == -1) {
        return null;
    }
    startIdx = xml.indexOf(">", startIdx);
    if(startIdx == -1) {
        return null;
    }

    int closeIdx = xml.indexOf(closeTag, startIdx);
    if(closeIdx == -1) {
        return null;
    }

    return xml.substring(startIdx+1, closeIdx);
}

在上面的代码示例中,我们允许tag具有属性,并且避免了直接用开始tag的名字进行匹配。例如,因为我们查找的是<type>而不会找到<typeName>上去。当然,我们没有允许相同的tag进行嵌套,并且只使用了tag的第一个实例。

采用专门为XML设计的String实用库,使你在访问小量XML内容时可以避免使用那些复杂繁重的XML解析器。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134