Java中解析XML时,如何从字符串中删除无效字符?

4
我一直在Google和Stack Overflow上搜索,但没有任何作用。我遇到了一个与XML源中的字符有关的问题。我将每个标记的值保存在字符串中,但是当
出现时,它就停止了。我只能得到标记中的前4-5个单词左右。
请问是否有人可以帮我编写一个方法来删除它?或者XML源中标记中的文本是否太长而无法存储在字符串中?
谢谢!
示例代码:
    public void characters(char[] ch, int start, int length)
        throws SAXException {

    if (currentElement) {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

}

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

    currentElement = false;

    /** set value */ 
    if (localName.equalsIgnoreCase("title"))
        sitesList.setTitle(currentValue);
    else if (localName.equalsIgnoreCase("id"))
        sitesList.setId(currentValue);
    else if(localName.equalsIgnoreCase("description"))
        sitesList.setDescription(currentValue);
}

描述标签中的文本内容非常长,但在出现
字符之前,我只能获得前五个字。

1
你能展示你代码的相关部分以及你看到的哪些无效字符吗? - Anders Lindahl
1个回答

1

你正在使用SAX解析器来解析XML字符串。

当仅读取一个XML元素时,characters()方法可能会被调用多次。这种情况发生在它发现类似于<desc>blabla bla & # 39; bla bla la.</desc>的内容时。

解决方案是使用StringBuilder并在characters()方法中添加已读取的字符,然后在endElement()方法中重置StringBuilder

private class Handler extends DefaultHandler{

    private StringBuilder temp_val;

    public Handler(){
        this.temp_val = new StringBuilder();
    }

    public void characters(char[] ch, int start, int length){
        temp_val.append(ch, start, length);
    }

    public void endElement(String uri, String localName, String qName){
        System.out.println("Output: "+temp_val.toString());
        // ... Do your stuff
        temp_val.setLength(0); // Reset the StringBuilder
    }

}

对我来说,上述代码在给定这个XML文件的情况下是有效的:

<?xml version="1.0" encoding="iso-8859-1" ?>
<test>This is some &#13; example-text.</test>

输出为:

输出:这是一个
示例文本。


那么当我设置值时,我应该使用 temp_val.toString() 吗? - Magnus
endElement() 方法中设置您的值,并在其末尾重置 StringBuilder。并请更具体地说明“不起作用”的情况。 - Lukas Knuth
你的意思是设置值,就像 temp_val.toString() 一样吗?我确实这样做了,但我仍然无法获取描述标签中的所有文本。当它遇到我在帖子中抱怨的字符时停止。 - Magnus
它是否与XML的编码有关?我的是UTF-8。 - Magnus
我按照您在帖子中所做的完全相同,但它不会添加任何讨厌字符后面的文本。 - Magnus
当我使用UTF-8编码时,它对我也有效。你尝试过使用XmlPullParser吗?如果你使用next()来处理文件,解析器应该会处理实体。 - Lukas Knuth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接