【问题标题】:facing issue while parsing xml containing xi:includes with jaxb解析包含 xi:includes 和 jaxb 的 xml 时面临问题
【发布时间】:2012-04-18 15:31:36
【问题描述】:

我正在使用 JAXB 来解析 xml。我有一个如下架构以及在此架构上定义的两个 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>

这是两个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);

解析成功,但Details JAXB 标记对象为空。无论如何,a.xml 文件中的 xi:include 标记没有被展平。有什么想法吗?

【问题讨论】:

  • 你的领域模型是什么样的?
  • Blaise,对不起,我没有得到你。什么是领域模型?
  • 是的,我很好奇您要映射到什么。
  • 嗨,Blaise,谢谢.... 由于此处提供的空间较少,我创建了一个新的 stackoverflow 问题,标题为“在解析包含 xi:includes 和 jaxb 的 xml 时面临问题”。你能看看这个并帮助我如何解决这个问题。谢谢,达山
  • 架构拼写错误? &lt;xs:element name="NAme" -> "Name"?在您的架构中,您将Details 定义为Name 元素的序列,而您实际上在Details 元素中获得了Detail 元素的序列...

标签: java xml jaxb


【解决方案1】:

试试这个,绝对有效:

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);
    }
}

【讨论】:

    【解决方案2】:

    你应该添加

        spf.setNamespaceAware(true);
    

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多