与标题中一样,我目前正在处理需要解析XML格式的String,同时能够存储有关元素标记的开头的字符索引和原始String中元素标记的结尾的信息。我看过SAX和DOM,我似乎找不到任何可以提供这些数据的东西。有什么建议吗?
感谢。
答案 0 :(得分:0)
不确定是否有用,但鉴于SAX是连续的,你不能保留一个字符计数器吗?唯一的问题是可能会忽略某些空格。
答案 1 :(得分:0)
您可能需要查看Locator
,DefaultHandler
和SAXParser
。作为给出行号和列号的示例:
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文档的字符内容。在某些情况下,这些“行”数字与列显示的内容相匹配,而在其他情况下,由于内部实体扩展,它们可能与源文本不匹配。
返回值是文档实体或外部解析实体中行号的近似值,其中触发事件的标记出现。