rodgerwilco: XML-Datei mit Schema auf doppelte Einträge prüfen

Hallo zusammen,

ich habe ein Problem beim Prüfen von XML-Dateien mittels eines Schemas. Beides ist weiter unten zu finden. Es soll mittels des Schemas geprüft werden, ob unter dem Element "NochMehrStruktur" im Unterelement "Kinder" doppelte Einträge vorhanden sind. Es soll lediglich jeder Eintrag einmal vorhanden sein. Für <NochMehrStruktur id="id1234"> funktioniert dieses auch. Jedoch bekomme ich bei der Validierung immer einen Fehler im Element <NochMehrStruktur id="id2345">. Dies soll jedoch nicht als Fehler aufgeführt werden, da dieses in meinem Fall zulässig wäre. Kann mir jemand helfen und sagen, was ich falsch mache? Es sollen immer nur die Elemente <NochMehrStruktur> für sich betrachtet werden und nicht übergreifend. Der relevante Teil ist der mit <xs:unique name="uniqueKinder">.

Danke für eure Hilfe rodgerwilco

<Daten>
	<Objekte>
		<NochMehrStruktur id="id1234">
			<Kinder>
				<element>kind1</element>
				<element>kind2</element>
				<element>kind1</element> <!-- Fehler, weil doppelt unter id1234 -->
			</Kinder>
		</NochMehrStruktur>
		
		<NochMehrStruktur id="id2345">
			<Kinder>
				<element>kind1</element> <!-- OK, weil anderes Strukturelement als id1234 -->
				<element>kind5</element>
				<element>kind6</element>
			</Kinder>
		</NochMehrStruktur>
	</Objekte>
</Daten>
<?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

	<xs:element name="Daten">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Objekte">
					<xs:complexType>
						<xs:sequence>
							<xs:choice maxOccurs="unbounded">
								<xs:element name="NochMehrStruktur">
									<xs:complexType>
										<xs:sequence>
											<xs:element name="Kinder">
												<xs:complexType>
													<xs:sequence>
														<xs:choice maxOccurs="unbounded">
															<xs:element name="element" type="xs:string" />
														</xs:choice>
													</xs:sequence>
												</xs:complexType>
											</xs:element>
										</xs:sequence>
										<xs:attribute name="id" type="xs:string" use="required" />
									</xs:complexType>
								</xs:element>
							</xs:choice>
						</xs:sequence>
					</xs:complexType>
					
					<xs:unique name="uniqueKinder">
						<xs:selector xpath="NochMehrStruktur/Kinder/element"/>
						<xs:field xpath="."/>
					</xs:unique>

				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

akzeptierte Antworten

  1. Hallo rodgerwilco,

    das Problem liegt an der Position von xs:unique unterhalb von "Objekte". Platziere es bei der Elementdeklaration für die jeweiligen "Kinder":

    <xs:element name="Kinder">
      <xs:complexType>
        <xs:sequence>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="element" type="xs:string"/>
          </xs:choice>
        </xs:sequence>
      </xs:complexType>
      <xs:unique name="uniqueKinder">
        <xs:selector xpath="element"/>
        <xs:field xpath="."/>
      </xs:unique>
    </xs:element>
    
    

    Somit wird nur die Dopplung von "kind1" beim ersten "Kinder"-Element beanstandet.

    Grüße,
    Thomas

    1. Dankeschön. So einfach kann es manchmal sein. Mit deiner Änderung funktioniert es nun wie gewünscht.

      Dankeschön 😀