我有一些场景层次结构,其中节点在时尚上彼此继承。
<xs:complexType name="XNode">
<xs:attribute name="layer" type="xs:integer" use="optional"/>
</xs:complexType>和
<xs:complexType name="XStyleable">
<xs:complexContent>
<xs:extension base="XNode">
<xs:attribute name="id" type="xs:string" use="optional"/>
<xs:attribute name="class" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>我想要的地方
<xs:complexType name="XGroup">
<xs:complexContent>
<xs:extension base="XStyleable">
<xs:sequence>
<xs:element name="XNode" type="XNode" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>它不仅可以识别XNodes,还可以识别扩展XNode的所有内容,因此具有如下的结构
<XGroup>
<XNode/>
<XGroup/>
<XNode/>
<XStyleable/>
</XGroup>结果是XGroup的实例,其中包含三个实例(两个XNode、一个XGroup和一个XStyleable),在这个列表中,我可以在它的原始类上测试每个实例,并在转换后确定它的可信度。
我知道我能做到
<xs:complexType name="XGroup">
<xs:complexContent>
<xs:extension base="XStyleable">
<xs:sequence>
<xs:element name="XNode" type="XNode" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="XGroup" type="XGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>但是,这忽略了关于父节点的原始顺序的信息,我想保留这些信息。
你对如何解决这个问题有什么建议吗?我真的不想为了得到这样的行为而编写自己的解析器:
发布于 2014-10-15 23:56:11
您可以执行以下操作:
XML (schema.xsd)
您可以利用XML中的替换组并设置它,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="XNode" type="XNode"/>
<xs:complexType name="XNode">
<xs:attribute name="layer" type="xs:integer" use="optional"/>
</xs:complexType>
<xs:element name="XStyleable" type="XStyleable" substitutionGroup="XNode"/>
<xs:complexType name="XStyleable">
<xs:complexContent>
<xs:extension base="XNode">
<xs:attribute name="id" type="xs:string" use="optional"/>
<xs:attribute name="class" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="XGroup" type="XGroup" substitutionGroup="XNode"/>
<xs:complexType name="XGroup">
<xs:complexContent>
<xs:extension base="XStyleable">
<xs:sequence>
<xs:element ref="XNode" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>生成Java模型
运行以下代码将从XML生成一个Java模型。因为XML中没有目标命名空间,所以默认的包名是generated。
xjc schema.xsd演示代码
Demo
import generated.XGroup;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance("generated");
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("input.xml");
JAXBElement<XGroup> je = (JAXBElement<XGroup>) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(je, System.out);
}
}input.xml/Output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XGroup>
<XNode/>
<XGroup/>
<XNode/>
<XStyleable/>
</XGroup>欲了解更多信息
我在我的博客上写了更多关于这个的文章:
https://stackoverflow.com/questions/26392161
复制相似问题