如何解析XML String并检索元素的char索引?

时间:2012-07-02 18:32:33

标签: java xml string parsing indexing

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可能需要查看LocatorDefaultHandlerSAXParser。作为给出行号和列号的示例:

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文档的字符内容。在某些情况下,这些“行”数字与列显示的内容相匹配,而在其他情况下,由于内部实体扩展,它们可能与源文本不匹配。

     

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