gpt4 book ai didi

java - 为什么在使用 SaxParser 解析 xml 标记时缺少某些字符?

转载 作者:行者123 更新时间:2023-11-29 09:44:02 24 4
gpt4 key购买 nike

我正在使用 SaxParser 解析我的 android 应用程序中包含近 90000 个字符的 xml 响应。 xml 如下所示:

 <Registration>
<Client>
<Name>John</Name>
<ID>1</ID>
<Date>2013:08:22T03:43:44</Date>
</Client>
<Client>
<Name>James</Name>
<ID>2</ID>
<Date>2013:08:23T16:28:00</Date>
</Client>
<Client>
<Name>Eric</Name>
<ID>3</ID>
<Date>2013:08:23T19:04:15</Date>
</Client>

.....
</Registration>

有时解析器会遗漏日期标签中的一些字符。它没有返回 2013:08:23T19:04:15,而是返回 2013:08:23T。我尝试使用以下代码行从响应 xml 字符串中跳过所有空格:

 responseStr = responseStr.replaceAll("\\s","");

但随后出现以下异常:

 Parsing exception: org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 16: not well-formed (invalid token)

以下是我用于解析的代码:

 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 {
tagName = qName;
}

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

}

public void characters(char ch[], int start, int length) throws SAXException {
if(tagName.equals("Name")){
obj = new RegisteredUser();
String str = new String(ch, start, length);
obj.setName(str);
}else if(tagName.equals("ID")){
String str = new String(ch, start, length);
obj.setId(str);
}else if(tagName.equals("Date")){
String str = new String(ch, start, length);
obj.setDate(str);

users.add(obj);
}
}

public void startDocument() throws SAXException {
System.out.println("document started");
}

public void endDocument() throws SAXException {
System.out.println("document ended");
}
};

saxParser.parse(new InputSource(new StringReader(resp)), handler);

}catch(Exception e){
System.out.println("Parsing exception: "+e);
System.out.println("exception");

}

知道为什么解析器会跳过标记中的字符吗?我该如何解决这个问题。提前致谢。

最佳答案

对于任何给定的文本节点,characters 可能会被多次调用。

在那种情况下,您必须自己连接结果!

这是因为当解析器的一些内部缓冲区结束时,文本节点的内容仍然存在。不是扩大缓冲区(当文本节点很大时可能需要很多内存),而是让客户端代码处理。

你想要这样的东西:

StringBuilder textContent = new StringBuilder();

public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
tagName = qName;
textContent.setLength(0);
}
public void characters(char ch[], int start, int length) throws SAXException {
textContent.append(ch, start, length);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
String text = textContent.toString();
// handle text here
}

当然可以改进此代码以仅跟踪您真正关心的节点的文本内容。

关于java - 为什么在使用 SaxParser 解析 xml 标记时缺少某些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18460518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com