我有从XSD生成的XmlBeans类。我想跟踪持久对象的行号。这可能吗?我不在乎此信息是在解析期间(xml→Bean)还是在prettyprinting(beans→xml)期间存储的,因为我在应用程序流程中将它们保持同步。

如果可能的话,我想要开始和结束行/列号。

我不在乎是否必须使用某种非标准的技巧来获取定位器数据。

如果有另一个Java XML框架可以从XSD文件生成类并支持定位器数据,那么我愿意切换。

最佳答案

只需使用XmlOptions#setLoadLineNumbers(),例如:

MyDocument.Factory.parse(xmlFile, new XmlOptions().setLoadLineNubmers());


然后,要从xml存储中检索行号,请找到最近的XmlLineNumber书签。

import org.apache.xmlbeans.*;

public class linenumber
{
    public static void main(String[] args) throws XmlException
    {
        XmlOptions options = new XmlOptions().setLoadLineNumbers();
        XmlObject xobj = XmlObject.Factory.parse("<a>\n<b>test</b>\n<c>test</c>\n</a>", options);

        // let's get the line number for the '<c>' xml object
        XmlObject cobj = xobj.selectPath(".//c")[0];
        System.out.println(cobj.xmlText());

        XmlCursor c = null;
        try
        {
            c = cobj.newCursor();

            // search for XmlLineNumber bookmark
            XmlLineNumber ln =
                (XmlLineNumber) c.getBookmark( XmlLineNumber.class );

            if (ln == null)
                ln = (XmlLineNumber) c.toPrevBookmark( XmlLineNumber.class );

            if (ln != null)
            {
                int line = ln.getLine();
                int column = ln.getColumn();
                int offset = ln.getOffset();

                System.out.println("line=" + line + ", col=" + column + ", offset=" + offset);
            }
        }
        finally
        {
            if (c != null) c.dispose();
        }
    }
}

关于java - 读/写期间的XmlBeans源定位器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10241929/

10-09 19:24