재귀적인 데이터 구조에 XML 스키마를 정의하려고합니다. 기본적으로 요소는 자식 및 속성을 가질 수 있어야하며, 이는 차례대로 자식 및 속성을 가질 수있는 요소의 목록입니다. "요소"는 유형의 범위 중 하나 일 수 있으며, 모두 일부 추가 데이터 외에도 하위 요소 및 특성을 가질 가능성이 있습니다. 따라서 요소 유형은 BaseElementType
에서 계승되고 맨 위에 자체 데이터가 추가됩니다.내 XSD가 일부 요소의 유효성을 검사하지 않는 이유는 무엇입니까?
나는 약간의 진전을 보였지만 유효성 검사기가 구조체를 내려갈 때 거의 아무 것도 받아들이지 않고 문제가 발생했습니다. 다음과 같이
내 스키마는 다음과 같습니다
여기<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/ElementSchema" xmlns="http://www.example.org/ElementSchema">
<xs:element name="BaseElement" type="BaseElementType" />
<xs:element name="DoubleElement" type="DoubleElementType" />
<xs:element name="BoundedDoubleElement" type="BoundedDoubleElementType" />
<xs:element name="Properties" type="ElementList" />
<xs:element name="Children" type="ElementList" />
<xs:complexType name="ElementList">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="BaseElement" />
<xs:element name="DoubleElement" />
<xs:element name="BoundedDoubleElement" />
</xs:choice>
</xs:complexType>
<xs:complexType name="BaseElementType">
<xs:sequence>
<xs:element name="Children" type="ElementList" minOccurs="0" />
<xs:element name="Properties" type="ElementList"
minOccurs="0" />
</xs:sequence>
<xs:attribute name="ID" type="xs:positiveInteger" use="required" />
<xs:attribute name="Key" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="DoubleElementType">
<xs:complexContent>
<xs:extension base="BaseElementType">
<xs:sequence>
<xs:element name="Value" type="xs:float" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BoundedDoubleElementType">
<xs:complexContent>
<xs:extension base="DoubleElementType">
<xs:sequence>
<xs:element name="DesiredValue" type="xs:float" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
내가 확인하려고하는 XML 파일입니다. 태그 <wrongAccepted>
과 <wrongRejected>
을 몇 군데에 삽입하여 유효성 검사가 예상대로 작동하는 위치와 불법 태그를 허용하는 위치를 보여줍니다.
<?xml version="1.0" encoding="utf-8"?>
<t:BoundedDoubleElement ID="12" Key="test"
xmlns:t="http://www.example.org/ElementSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/ElementSchema ElementSchema.xsd">
<Children>
<BaseElement ID="13" Key="child">
<Properties>
<DoubleElement ID="10" Key="Null">
<Value>-INF</Value>
<wrongAccepted></wrongAccepted>
</DoubleElement>
<wrongAccepted></wrongAccepted>
</Properties>
</BaseElement>
<wrongRejected></wrongRejected>
</Children>
<Properties>
<wrongRejected></wrongRejected>
<DoubleElement ID="10" Key="Null" Role="LowerBound" Tag="-1">
<Value>-INF</Value>
<wrongAccepted></wrongAccepted>
</DoubleElement>
<DoubleElement ID="11" Key="Null" Role="UpperBound" Tag="-1">
<Value>INF</Value>
</DoubleElement>
</Properties>
<Value>10</Value>
<DesiredValue>10</DesiredValue>
<wrongRejected></wrongRejected>
</t:BoundedDoubleElement>
그래서 어떻게하면 유효하지 않은 태그를 거부 할 수 있습니까?
참고 :이 테스트는 일식입니다. 나는 처음에는 그것을 검증하는 데 몇 가지 문제가 있었지만 지금은 효과가있는 것으로 보인다. 또한 메모장 ++의 유효성 검사기는 정확히 동일한 결과를 산출합니다.
예수 그리스도. 고맙습니다. 너무 간단! 나는 너무 오랫동안 그것을 꼼짝 않고 바라보고 있었다. – Taus