Java SAX解析器字符方法不';不要收集所有内容
我正在使用SAX解析器解析XML,并且工作正常 我有以下XML标记Java SAX解析器字符方法不';不要收集所有内容,java,xml,sax,Java,Xml,Sax,我正在使用SAX解析器解析XML,并且工作正常 我有以下XML标记 <value>•CERTASS >> Certass</value> 不能保证characters()方法在元素中只运行一次 如果将内容存储在字符串中,并且characters()方法碰巧运行了两次,则只能从第二次运行中获取内容。第二次运行characters方法时,它将覆盖第一次存储的temp变量的内容 要解决此问题,请使用StringBuilder和append()处理character
<value>•CERTASS >> Certass</value>
不能保证
characters()
方法在元素中只运行一次
如果将内容存储在字符串中
,并且characters()
方法碰巧运行了两次,则只能从第二次运行中获取内容。第二次运行characters方法时,它将覆盖第一次存储的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());
}
};
解析字符串
“•CERTASS>>CERTASS
”,上面的处理程序给出输出:
?CERTASS >> Certass
我希望这能有所帮助。前几天我遇到了这个问题,原因是CHaracters方法被多次调用,如果值中包含以下任何字符:
" "
' '
< <
> >
& &
谢谢你的回答。我有wuch>>这样的护照,>>通行证加上。这个逻辑能处理吗?另外,我可以使用DOM解析器来避免此类问题吗?实际上,DOM解析器甚至不允许您解析带有未转义特殊字符的文档。我很高兴能帮上忙。
" "
' '
< <
> >
& &
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 = "";
}
}
}