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解析器。