4

如标题所示,我目前正在处理解析 XML 格式字符串的需求,同时能够存储有关原始字符串中元素标记开头和元素标记结尾的字符索引的信息。我查看了 SAX 和 DOM,但似乎找不到任何可以为我提供这些数据的东西。有什么建议么?

谢谢。

4

2 回答 2

0

不确定是否有帮助,但鉴于 SAX 是连续的,你不能保留一个字符计数器吗?唯一的问题是一些空格可能会被忽略。

于 2012-07-02T18:46:28.960 回答
0

您可能想查看Locator和。作为给出行号和列号的示例:DefaultHandlerSAXParser

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
    String xml = 
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<project \n"+ 
            ">\n"+
            "    <description>A description</description>\n"+
            "</project>\n";
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    InputSource inps = new InputSource(new StringReader(xml));
    DefaultHandler df = new XDefaultHandler();
    sp.parse(inps, df);
}

static class XDefaultHandler extends DefaultHandler {
    Locator l = null;

    @Override
    public void setDocumentLocator(Locator locator) {
        l = locator;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("element: " + qName);
        System.out.println("locator: " + l.getLineNumber() + "/" + l.getColumnNumber());
    }
}

输出是:

element: project
locator: 3/2
element: description
locator: 4/18

覆盖 XDefaultHandler 中的其他方法以接收对元素结束等的调用。

编辑:(太早按下按钮)

从以下文档Locator.getLineNumber()

返回当前文档事件结束的行号。行由 XML 规范中定义的行尾分隔。

警告:该方法的返回值仅用作诊断的近似值;它不是为了提供足够的信息来编辑原始 XML 文档的字符内容。在某些情况下,这些“行”号与将显示为列的内容相匹配,而在其他情况下,由于内部实体扩展,它们可能与源文本不匹配。

返回值是触发事件的标记出现的文档实体或外部解析实体中行号的近似值。

于 2012-07-02T20:13:20.470 回答