[XML Schema / Java] atrybuty z przestrzeni XSI bez użycia prefixu

0

Problematyczny XML, który przychodzi z zewnątrz; nie ma zdefiniowanych przestrzeni nazw:

<?xml version="1.0"?>
<response>
    <externalUrl nil="true" />
</response>

Fragment napisanego przeze mnie XSD:

<xs:element name="externalUrl" type="xs:string" nillable="true" />

Dokument się nie waliduje, bo atrybut nil nie jest rozpoznawany jako atrybut z XMLSchema-instance. Parser wywala błąd:
**Element 'externalUrl' is a simple type, so it cannot have attributes, excepting those whose namespace name is identical to 'http://www.w3.org/2001/XMLSchema-instance' and whose [local name] is one of 'type', 'nil', 'schemaLocation' or 'noNamespaceSchemaLocation'. However, the attribute, 'nil' was found.**

XSD jest dynamicznie dołączane w kodzie:

            SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(false);
            factory.setSchema(schema);

            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(xmlStream);

Dokument się ładnie waliduje, gdy dodam mu namespace xmlns:xsi (XMLSchema-instance), a atrybut nil poprzedzę prefiksem xsi. Niestety taka zmiana odpada, bo dostaję już gotowego XML-a z zewnętrznego serwisu, mam wpływ tylko na kod Javy i XML Schema. Chyba nie za bardzo ogarniam przestrzenie nazw, proszę o pomoc - co zrobić żeby uniknąć wstawiania prefiksu w parsowanym dokumencie?

0

Znam się na XSD tylko mniej-więcej, ale parser ma rację, bo definiujesz externalUrl jako SimpleType, a SimpleTypem nie jest, bo zawieta atrybut nil.

Takie coś powinno uspokoić parser, tylko nie wiem czy to ci wystarczy:

<xs:element name="externalUrl" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
  <xs:simpleContent>
	<xs:extension base="xs:string">
	  <xs:attribute name="nil" type="xs:string" use="required" />
	</xs:extension>
  </xs:simpleContent>
</xs:complexType>
</xs:element>
0

Chodzi właśnie o to, żeby tego atrybutu nie definiować, bo to jest atrybut "wbudowany" (zdefiniowany przez standard W3C: http://www.w3.org/TR/xmlschema-1/#xsi_nil). Jego wystąpienie oznacza, że wartość danego elementu jest null-em. W Schemie zapisuje się to poprzez nillable="true". Jeśli natomiast externalUrl nie zawiera tego atrybutu, to musi zawierać tekst (xs:string).

Problem tylko w tym, że aby był on rozpoznany jako ten "wbudowany", trzeba mu dorzucić prefix xsi. W razie braku prefixu, atrybut jest traktowany jako "zwykły", a wtedy faktycznie nie ma prawa się walidować, bo externalUrl jest typu prostego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1