2017-09-01 1 views
2

Der Namespace xmlns ist in "parent" definiert und wird in "child" überschrieben. Da mein xsi in "parent" und "child" identisch ist, muss ich auch den xsi-Namespace in "child" überschreiben?Was passiert mit einem Namespace, der zu einem überschriebenen Namespace gehört?

<parent xmlns="namespace_A" xmlns:xsi="namespace_C" xsi:schemaLocation="namespace_D"> 
     <child xmlns="namespace_B" xsi:schemaLocation="namespace_E"> 
     </child> 
</parent> 

Alle Online-Validierer Ich habe versucht, die XML überprüfen als akzeptiert, aber ich erhalte eine Fehlermeldung, wenn die XML-Verarbeitung, die xsi sagt nicht in „Kind“ gebunden.

Der besondere Code, wo ich dieses Problem habe, ist:

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> 
    <responseDate>2017-08-24T12:54:26</responseDate> 
    <request verb="ListRecords" from="2017-08-08" set="J:10.1007:53599" metadataPrefix="CR_UNIXML" resumptionToken="91554975-0bb1-4cf5-86ae-b2222e6fe01f">http://oai.crossref.org/OAIHandler</request> 
    <!-- recipient 96 crlabs2 --> 
    <ListRecords> 
     <record> 
     <header> 
      <!-- citation-id: 92292627; type: JOURNAL_ARTICLE; --> 
      <identifier>info:doi/10.1007/s40278-017-34281-1</identifier> 
      <datestamp>2017-08-11</datestamp> 
      <setSpec>J</setSpec> 
      <setSpec>J:10.1007</setSpec> 
      <setSpec>J:10.1007:53599</setSpec> 
     </header> 
     <!-- [email protected] --> 
     <metadata> 
      <crossref xmlns="http://www.crossref.org/xschema/1.1" xsi:schemaLocation="http://www.crossref.org/xschema/1.1 http://www.crossref.org/schema/unixref1.1.xsd"> 

Dies ist die xml als Antwort von einem externen Dienstleister gegeben ist. Ich möchte nur durch den gleichen Außendienst gegeben einige der Daten mit einem Prozessor verarbeiten, die XSLT-Dateien akzeptiert, die gewünschten Daten abrufen, aber ich erhalte die folgenden Fehler:

ERROR: 'The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 

Der Fehler in der Klasse XMLNSDocumentScannerImpl auftritt, Verfahren scanStartElement(). In der folgenden Schleife ist die uri Null und der Fehler wird ausgelöst.

// bind attributes (xmlns are already bound bellow) 
      int length = fAttributes.getLength(); 
      // fLength = 0; //initialize structure 
      for (int i = 0; i < length; i++) { 
       fAttributes.getName(i, fAttributeQName); 

       String aprefix = fAttributeQName.prefix != null 
         ? fAttributeQName.prefix : XMLSymbols.EMPTY_STRING; 
       String uri = fNamespaceContext.getURI(aprefix); 
       // REVISIT: try removing the first "if" and see if it is faster. 
       // 
       if (fAttributeQName.uri != null && fAttributeQName.uri == uri) { 
        // checkDuplicates(fAttributeQName, fAttributes); 
        continue; 
       } 
       if (aprefix != XMLSymbols.EMPTY_STRING) { 
        fAttributeQName.uri = uri; 
        if (uri == null) { 
         fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, 
           "AttributePrefixUnbound", 
           new Object[]{fElementQName.rawname,fAttributeQName.rawname,aprefix}, 
           XMLErrorReporter.SEVERITY_FATAL_ERROR); 
        } 
        fAttributes.setURI(i, uri); 
        // checkDuplicates(fAttributeQName, fAttributes); 
       } 
      } 
+0

Wenn Ihre Datei wirklich so startet (Sie zeigen nicht, wie es schließlich endet), dann ist ja, geben Sie diesen Fehler ein Problem auf der Prozessor-Seite. Ich kann Xerces jedoch nicht dazu bringen, mit diesem Fehler zu scheitern. Können Sie zeigen, welcher Java-Code diesen Fehler auslöst? – kumesana

+0

Die Frage wurde erneut mit dem Code aktualisiert, der den Fehler in Xerces triggert. – nrad0

Antwort

3

Nichts passiert mit Namespaces, die überschrieben werden. Sie sind einfach nicht mehr der Namespace, der durch das entsprechende Präfix oder als Standard entworfen wurde. Das ist alles.

Es gibt keine Auswirkungen beim Überschreiben desselben xmlns: -Präfixes mit demselben Namespace-URI. Wie Sie festgestellt haben, ist Ihr xmlns: xsi immer gleich, so wie es sein sollte, es muss nicht anderswo als im root-Element definiert werden.

Beachten Sie auch, dass es nicht erforderlich ist, xsi: schemaLocation an anderer Stelle als im Stammelement zu definieren. Sie können die vollständige Liste aller Schemas für alle Namespaces im ersten xsi: schemaLocation direkt angeben, sodass Sie keine weiteren Schemata haben.

All the online validators I tried verify the xml as accepted but I get an error when processing the xml, which says xsi is not bound in "child".

In dem Beispiel, das Sie angegeben haben, ist xsi tatsächlich gebunden. Ein Prozessor, der behauptet, es sei nicht, ist falsch. Es ist fehlerhaft und gibt falsche Ergebnisse.

Aber vielleicht sind Ihre echten Dokumente nicht genau so, wie Sie ein Beispiel gaben.

Es ist unwahrscheinlich, aber möglich, dass ein Präfix, das in einem Ascendant-Element gebunden war, in einem Nachkommenelement nicht gebunden wäre. Also, Beispiele benötigt.

+0

Ich habe meine Frage mit dem besonderen Problem aktualisiert, das meine Frage ausgelöst hat. – nrad0

+0

Danke auch für Ihre Hilfe. – nrad0

Verwandte Themen