首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承层次分析法

继承层次分析法
EN

Stack Overflow用户
提问于 2014-10-15 21:08:27
回答 1查看 173关注 0票数 1

我有一些场景层次结构,其中节点在时尚上彼此继承。

代码语言:javascript
复制
<xs:complexType name="XNode">
    <xs:attribute name="layer" type="xs:integer" use="optional"/>
</xs:complexType>

代码语言:javascript
复制
<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>

我想要的地方

代码语言:javascript
复制
<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的所有内容,因此具有如下的结构

代码语言:javascript
复制
<XGroup>
    <XNode/>
    <XGroup/>
    <XNode/>
    <XStyleable/>
</XGroup>

结果是XGroup的实例,其中包含三个实例(两个XNode、一个XGroup和一个XStyleable),在这个列表中,我可以在它的原始类上测试每个实例,并在转换后确定它的可信度。

我知道我能做到

代码语言:javascript
复制
<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>

但是,这忽略了关于父节点的原始顺序的信息,我想保留这些信息。

你对如何解决这个问题有什么建议吗?我真的不想为了得到这样的行为而编写自己的解析器:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 23:56:11

您可以执行以下操作:

XML (schema.xsd)

您可以利用XML中的替换组并设置它,如下所示:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
xjc schema.xsd

演示代码

Demo

代码语言:javascript
复制
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

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XGroup>
    <XNode/>
    <XGroup/>
    <XNode/>
    <XStyleable/>
</XGroup>

欲了解更多信息

我在我的博客上写了更多关于这个的文章:

  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26392161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档