我使用SAX解析器来解析XML并且工作正常。
我在XML中有以下标记。
<value>•CERTASS >> Certass</value>
我希望&#39; •CERTASS&gt;&gt; Certass &#39;作为输出。但是下面的代码只返回Certass
。 value
标签的特殊字符是否存在任何问题?
public void characters(char[] buffer, int start, int length) {
temp = new String(buffer, start, length);
}
答案 0 :(得分:4)
无法保证characters()
方法只能在元素内运行一次。
如果要将内容存储在String
中,并且characters()
方法恰好运行两次,则只会从第二次运行中获取内容。 character方法第二次运行时将覆盖第一次存储的temp
变量的内容。
要解决此问题,请使用StringBuilder
中的append()
和characters()
内容,然后处理endElement()
中的内容。例如:
DefaultHandler handler = new DefaultHandler() {
private StringBuilder stringBuilder;
@Override
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
stringBuilder = new StringBuilder();
}
public void characters(char[] buffer, int start, int length) {
stringBuilder.append(new String(buffer, start, length));
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(stringBuilder.toString());
}
};
解析String
&#34; <value>•CERTASS >> Certass</value>
&#34;并且上面的处理程序给出了输出:
?CERTASS >> Certass
我希望这会有所帮助。
答案 1 :(得分:0)
前几天我遇到了这个问题,事实证明原因是如果值中包含以下任何字符,则多次调用CHaracters方法:
" "
' '
< <
> >
& &
还要注意值内的换行符/换行符!!! 如果xml在没有您的控制的情况下被换行,则还会为该语句中的每一行调用character方法,此外它将返回换行符! (您需要手动依次删除)。
一个处理所有这些问题的示例处理程序是这样的:
DefaultHandler handler = new DefaultHandler() {
private boolean isInANameTag = false;
private String localname;
private StringBuilder elementContent;
@Override
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
if (qname.equalsIgnoreCase("myfield")) {
isInMyTag = true;
this.localname = localname;
this.elementContent = new StringBuilder();
}
}
public void characters(char[] buffer, int start, int length) {
if (isInMyTag) {
String content = new String(ch, start, length);
if (StringUtils.equals(content.substring(0, 1), "\n")) {
// remove leading newline
elementContent.append(content.substring(1));
} else {
elementContent.append(content);
}
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qname.equalsIgnoreCase("myfield")) {
isInMyTag = false;
// do something with elementContent.toString());
System.out.println(elementContent.toString());
this.localname = "";
}
}
}