6

XMLを解析するためにJAXBを使用しています。以下のようなスキーマと、このスキーマで定義された 2 つの xml ファイル a.xml と b.xml があります。a.xml は、xi:include xml タグを介して b.xml に依存しています。より明確なデータについては、以下の例をファイルしてください

 I have followng schema definition:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  attributeFormDefault="unqualified">
    <xs:element name="Task">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Details" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="Details">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="NAme" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

2 つの xml ファイルを次に示します。

a.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Task xmlns:xi="http://www.w3.org/2001/XInclude">
<Details>
    <xi:include href="b.xml"/>
</Details>
</Task>

b.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <Detail>
  <Name>Name1</Name>
 </Detail>
<Detail>
   <Name>Name2</Name>
 </Detail>

現在、JAXB SAXFactory を使用してこれを次のように解析しています。

 JAXBContext jaxbcon = JAXBContext.newInstance("schema-definition-jaxb-files");
 unmar = jaxbcon.createUnmarshaller();

 SAXParserFactory spf = SAXParserFactory.newInstance();
 spf.setXIncludeAware(true);
 XMLReader xr = spf.newSAXParser().getXMLReader();
 SAXSource source = new SAXSource(xr, new InputSource(new    FileInputStream(xmlfilename)));
 Object obj = unmar.unmarshal(source);

解析は成功しましたが、詳細JAXB タグ オブジェクトが null です。とにかく、.xml ファイルの xi:include タグはフラット化されません。何か案が?

4

2 に答える 2

4

これを試してみてください、それは間違いなく動作します:

public class Test {
    public String include;

    public static void main(String[] args) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setXIncludeAware(true);
        spf.setNamespaceAware(true);
        XMLReader xr = spf.newSAXParser().getXMLReader();
        SAXSource src = new SAXSource(xr, new InputSource("test.xml"));
        Test t = JAXB.unmarshal(src, Test.class);
        System.out.println(t.include);
    }
}
于 2012-11-20T00:26:49.660 に答える
2

追加する必要があります

    spf.setNamespaceAware(true);
于 2012-11-20T00:23:35.160 に答える