多个同名但类型不同的元素

Posted

技术标签:

【中文标题】多个同名但类型不同的元素【英文标题】:Multiple elements with same name but different types 【发布时间】:2022-01-03 14:59:56 【问题描述】:

我创建了一个 XML,用于显示调查的回复。

XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type='text/xsl'?>
<survey>
    <questions>
        <question id="1">When did you start playing Pokemon Go?</question>
        <question id="2">What type of phone/OS do you play on?</question>
        <question id="3">What team are you on?</question>
        <question id="4">What Level Are You?</question>
        <question id="5">How many pokemon have you caught?</question>
        <question id="6">How many KM have you traveled? (Jogger medal)</question>
    </questions>
    <responses>
        <response id="1">
            <answer question="1">June</answer>
            <answer question="2">android</answer>
            <answer question="3">Mystic (Blue)</answer>
            <answer question="4">25</answer>
            <answer question="5">0 to 1000</answer>
            <answer question="6">Silver</answer>
        </response>
        <response id="2">
            <answer question="1">June</answer>
            <answer question="2">Android</answer>
            <answer question="3">Mystic (Blue)</answer>
            <answer question="4">32</answer>
            <answer question="5">0 to 1000</answer>
            <answer question="6">Silver</answer>
        </response>
        ... More responses...
    </responses>
</survey>

XSD(仅问题元素)

<xs:element name="questions">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                             fixed="1"/>    
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                              fixed="2"/>   
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                             fixed="3"/>    
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                              fixed="4"/>   
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                             fixed="5"/>    
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="question">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="id" 
                                             type="xs:int" use="required" 
                                             fixed="6"/>    
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

当我尝试针对我的 XML 验证它时,我的架构不断给我一个错误,说我有多个具有相同名称但类型不同的元素。 现在我在这里问了一个关于我的 XML 设计的问题,并被告知将不同的元素与 etc 一起使用真的很愚蠢。这就是为什么我重复元素名称,但每个元素都有一个标识属性。

是否有任何不涉及重新设计 XML 的解决方法?

【问题讨论】:

【参考方案1】:

称为“元素声明一致”的 XSD 约束明确表示不能有两个同名但类型不同的兄弟元素。

您确定要像这样的细粒度架构,而更改问卷中的问题需要更改架构?

如果您确实想这样做,您可以使用 XSD 1.1 中的“条件类型分配”功能(又名类型替代),您可以根据 @id 属性的值设置 question 元素的类型。

但我觉得整个设计有问题。我会选择一个描述任何可能的问卷的通用模式。

【讨论】:

嗯,问题是我的任务是确保每个问题都只有特定的答案。问题 1:一年中的 12 个月中的任何一个问题 2:“Android”、“ios”、“Both” 等中的任何一个。因此必须将它们插入到模式中。它不可能是通用的。 我认为我不会为此目的使用 XSD。但这显然是一项学生作业(XML 调查问卷总是如此),并且必须接受为学生作业选择技术是出于教学而非工程原因的事实。 您认为最好只通过 等调用每个 和 元素吗? 如果不考虑整个应用程序的设计,我无法回答这个问题:问卷是如何设计的,它们是如何完成的,如何分析响应,当响应无效时会发生什么。我根本不知道您的实例文档和架构在宏伟的计划中扮演什么角色。而且我不会参与需求分析。

以上是关于多个同名但类型不同的元素的主要内容,如果未能解决你的问题,请参考以下文章

当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素

java两个同名一样的,参数类型都是同样的集合类型,但泛型的元素类型不

反序列化杰克逊中同名但不同类型的属性?

Java基础语法

面试题

方法重载