【问题标题】:How to parse XML String and retrieve char index of elements?如何解析 XML 字符串并检索元素的字符索引?
【发布时间】:2012-07-03 04:41:16
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java xml string parsing indexing


    【解决方案1】:

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

    【讨论】:

    • 我将把计数器放在哪里以及如何增加它?你能详细说明一下吗?
    【解决方案2】:

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

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

    【讨论】:

    • 由于我将按索引查找文档的各个部分,因此不幸的是,在这种情况下,行和列将无济于事。
    猜你喜欢
    • 2021-12-26
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2021-11-25
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多