多个同名但类型不同的元素
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 中删除一个元素