1

我在SO上发现了这个问题。我展示了如何在使用 JAXB 解组时获取单个 xml 元素的行号。我扩展了这个例子,可以使用xinclude. 不幸的是,我无法获得xinclude.

那么,如何获取实际xinclude语句的行号?这是扩展示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class Demo {
    public static void main(String[] args) throws JAXBException, SAXException,
            ParserConfigurationException, FileNotFoundException {
        JAXBContext jc = JAXBContext.newInstance(Person.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setXIncludeAware(true);
        spf.setNamespaceAware(true);
        spf.setValidating(true);

        File file = new File("src/person.xml");
        XMLReader xr = spf.newSAXParser().getXMLReader();
        xr.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId)
                    throws SAXException, IOException {
                System.out.println(publicId + " -> " + systemId);
                return null;
            }
        });
        SAXSource source = new SAXSource(xr, new InputSource(
                new FileInputStream(file)));
        Person person = (Person) unmarshaller.unmarshal(source);

        System.out.println("Person:  " + person.locator.getLineNumber());
        System.out.println("Address:  "
                + person.address.locator.getLineNumber());
    }
}

EntityResolver听者告诉我有一个语句xinclude,但我不知道在哪个行号。

人.xml

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xi="http://www.w3.org/2001/XInclude">
    <name>Jane Doe</name>
    <xi:include href="./src/address.xml" />
</person>

地址.xml

<?xml version="1.0" encoding="UTF-8"?>
<address>1 A Street</address>

我没有提到PersonandAddress类,所以这个问题保持简短和紧凑:) 我还Locator用 . 标记了每个字段@XmlTransient。谢谢!

4

0 回答 0