0

假设我有一个 XML 文件,它是以下格式的 SAX 解析(Java):

                <RootElement>
                  <text> blabla </text>
                  <rule1 name="a">1</rule1>
                  <rule2 name="b">2</rule2>
                </RootElement>

我如何在每条规则中引用名称的属性?我的目标是仅将名称为“a”的规则保存到 txt 文件中。谢谢

4

2 回答 2

0

当您使用 SAX 解析器读取 XML 时,您实现了一种 ContentHandler(请参阅http://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html)。在您的 ContentHandler 中,当解析器输入“rule1”和“rule2”时调用方法 startElement。startElement 的一个参数是属性,它基本上是属性名称(在您的示例中为“名称”)到对应值的映射。

一些代码片段如下所示:

// Handle XML SAX parser events.
private ContentHandler contentHandler = new ContentHandler() {
    public void startDocument() throws SAXException {...}

    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        cdata.setLength(0);
        if(atts == null) return;            
        // Write out attributes as new rows
        for(int i = 0; i < atts.getLength(); i++) {
            System.out.println(atts.getLocalName(i) + ": " + atts.getValue(i));
        }
    }


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

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

    // All other events are ignored
    public void endDocument() throws SAXException {}
    public void endPrefixMapping(String prefix) throws SAXException {}
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
    public void processingInstruction(String target, String data) throws SAXException {}
    public void setDocumentLocator(Locator locator) {}
    public void skippedEntity(String name) throws SAXException {}
    public void startPrefixMapping(String prefix, String uri) throws SAXException {}
};
于 2013-08-04T16:32:11.060 回答
0

如果您使用 SAX 解析 XML,则可以在实现的重写方法中检查元素的属性值(通过扩展DefaultHandler)。startElement()ContentHandler

public class MySAXHandler extends DefaultHandler {
    // ...
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // .. other elements ..
        // process <rule1,2 etc.
        if (localName.startsWith("rule")) {
            String value = attributes.getValue("name");
            if (value != null && value.equals("a")) {
                // save this rule
            }
        }
    }
}

参考
使用 SAX 解析 XML 文件

于 2013-08-04T16:33:28.597 回答