【问题标题】:SAX parser ignores text because of a <br /> tag由于 <br /> 标记,SAX 解析器忽略文本
【发布时间】:2014-04-05 16:06:31
【问题描述】:

这里有一个小问题,我不知道如何解决它。 我有一个如下所示的 XML 文件:

<?xml version="1.0"?>
<item>
 <title>Item 1</name>
 <description>Description Text 1&lt;br /&gt;Description Text 2</description>
</item>

我有一个如下所示的 SAX 解析器:

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if ("item".equals(qName)) {
        currentItem = new Item();
    } else if ("title".equals(qName)) {
        parsingTitle = true;
    } else if ("description".equals(qName)) {
        parsingDescription = true;
    }
}

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

    System.out.println("Testing endelement");

    if ("item".equals(qName)) {
        Items.add(currentItem);
        currentItem = null;
    } else if ("title".equals(qName)) {
        parsingTitle = false;
    } else if ("description".equals(qName)) {
        parsingDescription = false;
    }
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    System.out.println("writing");

    if (parsingTitle) {
        if (currentItem != null)
            currentItem.setTitle(new String(ch, start, length));
    } else if (parsingDescription) {
        if (currentItem != null) {
            currentItem.setDescription(new String(ch, start, length));
            parsingDescription = false;
        }
    }

问题在于 SAX 只解析标记中文本的第一部分,直到 "
" 文本(即
标记)并忽略其余部分。 如何让 SAX 解析器忽略“
”并解析其余的描述?

谢谢。

【问题讨论】:

  • 您使用的是什么 SAX 解析器?
  • Android java sax 解析器,如果我理解正确的话。
  • 如果您从characters 处理程序中删除parsingDescription = false 并将currentItem.setDescription(new String(ch, start, length)); 更改为currentItem.setDescription(currentItem.getDescription() + new String(ch, start, length));,结果是否会发生变化?
  • 不幸的是,给出的代码没有帮助(将解析的描述更改为“nullDescription Text 1”),我不太明白您提供的链接与我的问题有何关系。

标签: java android xml parsing sax


【解决方案1】:

正如 cmets 中所述,您不能依赖 characters() 一次性提供元素的所有文本。我推荐这样的东西(在代码中查找 cmets 以查看我修改它的位置),然后对标题进行类似的修改:

// buffer to hold description
private StringBuffer descriptionBuffer;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if ("item".equals(qName)) {
        currentItem = new Item();
    } else if ("title".equals(qName)) {
        parsingTitle = true;
    } else if ("description".equals(qName)) {
        parsingDescription = true;
        // initialize buffer
        descriptionBuffer = new StringBuffer();
    }
}

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

    System.out.println("Testing endelement");

    if ("item".equals(qName)) {
        Items.add(currentItem);
        currentItem = null;
    } else if ("title".equals(qName)) {
        parsingTitle = false;
    } else if ("description".equals(qName)) {
        // Put contents of buffer into description
        currentItem.setDescription(descriptionBuffer.toString());
        descriptionBuffer = null;
        parsingDescription = false;
    }
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {

    System.out.println("writing");

    if (parsingTitle) {
        if (currentItem != null)
            currentItem.setTitle(new String(ch, start, length));
    } else if (parsingDescription) {
        // add to buffer
        descriptionBuffer.append(ch, start, length); 
    }
}

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多