SAX - 阅读没有CDATA的HTML内容

时间:2017-02-03 11:12:40

标签: java html xml xml-parsing sax

我在Java中使用SAX解析器,它是必需的。我需要用HTML标签解析XML,我必须像内容一样阅读,我不能使用CDATA,因为我无法更改XML文件。 XML文件是这样的:

<start id="123">
    <tag1>text1</tag1>
    <tag2>
        This is an example
        <span>
            text inside an HTML tag
        </span>
        <p>
            ABCDEFG<b>HIJK</b>LMNOP
        </p>
    </tag2>
</start>

我需要的是当我获得tag2的内容时,内容必须是:

This is an example
<span>text inside an HTML tag</span>
<p>ABCDEFG<b>HIJK</b>LMNOP</p>

这是我做的测试,内容没有显示HTML标记:

boolean istag2 = false;

StringBuilder text = new StringBuilder();

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    System.out.println("Start Element :" + qName);
    if (qName.equals("tag2")) {
        istag2 = true;
    }
}

public void endElement(String uri, String localName, String qName) throws SAXException {
    if (qName.equals("tag2")) {
        istag2 = false;
        String fullText = text.toString();
        System.out.println("tag2 full_text: " + fullText);
    }
}

public void characters(char ch[], int start, int length) throws SAXException {
    if (istag2) {
        text.append(new String(ch, start, length));
    }
}

提前致谢

1 个答案:

答案 0 :(得分:0)

好的,我想我可能会理解你的期望是错误的。我想您可能希望通过"<span>"方法调用将字符串"<p>"characters()传递给您的应用程序。但事实并非如此:它们是通过startElement()endElement()上的来电传递的。如果要以词法形式构建包含这些标记的字符串,则需要执行以下操作:

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    System.out.println("Start Element :" + qName);
    if (qName.equals("tag2")) {
        inTag2 = true;
    } else if (inTag2) {
        text.append("<" + qName);
        // TODO: serialize any attributes
        text.append(">")
    }
}