2016-07-29 26 views
1

Ich bin ziemlich neu zu xsds, und derzeit die xsd, die ich verwende, validiert nur auf einige Maschinen. Es funktioniert auf meinem lokalen Computer, aber wenn ich dies auf einem Computer mit einigen Proxies oder Firewalls versuche, funktioniert es nicht mehr. Die Schemas, die ich verwende, werden jedoch lokal verwendet. Hierxsd überprüft auf einigen Systemen nicht: "Der Name kann nicht in eine (n) 'Typdefinitionskomponente aufgelöst werden."

ist der Fehler, den ich bekommen, wenn das XSD-Schema zu validieren versucht:

src-resolve: Kann nicht den Namen auflösen 'xenc: EncryptedDataType' auf eine (n) 'Typdefinition' Komponente.

, die von diesem Code kommt:

boolean validate(URL schemaUrl) { 
     SchemaFactory schemaFactory = SchemaFactory 
       .newInstance("http://www.w3.org/2001/XMLSchema"); 
     Schema schema = null; 
     try { 
      schema = schemaFactory.newSchema(schemaUrl); //this is where the exception is thrown 
     } catch (SAXException e) { 
      //exception is caught here 
      return false; 
     } 
     //... more code here 
} 

Der Fehler hat den gleichen Stack-Trace wie diese: SAXParseException; src-resolve: Cannot resolve the name '...' to a(n) 'type definition' component

ich meine Haupt xsd haben, die ungefähr so ​​beginnt:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
      xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
      xmlns:tns="http://customization.elster.com/shipment" 
      targetNamespace="http://customization.client.com/introduction" 
      attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      version="1.1" > 
    <xs:import namespace="http://www.w3.org/2001/04/xmlenc#" schemaLocation="xenc-schema.xsd"/> 
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/> 

in diesem Haupt-XML-I n eed die "xenc: EncryptedDataType"

<xs:complexType name="NamedEncryptedDataType"> 
     <xs:complexContent> 
      <xs:extension base="xenc:EncryptedDataType"> 
       <xs:attribute name="name" type="xs:string" use="required"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

, die in dem xenc-schema.xsd definiert ist (die im selben Ordner wie mein Haupt xsd ist)

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" 
"http://www.w3.org/2001/XMLSchema.dtd" 
[ 
<!ATTLIST schema 
    xmlns:xenc CDATA #FIXED 'http://www.w3.org/2001/04/xmlenc#' 
    xmlns:ds CDATA #FIXED 'http://www.w3.org/2000/09/xmldsig#'> 
    <!ENTITY xenc 'http://www.w3.org/2001/04/xmlenc#'> 
    <!ENTITY % p ''> 
    <!ENTITY % s ''> 
    ]> 

<schema xmlns='http://www.w3.org/2001/XMLSchema' version='1.0' 
     xmlns:xenc='http://www.w3.org/2001/04/xmlenc#' 
     xmlns:ds='http://www.w3.org/2000/09/xmldsig#' 
     targetNamespace='http://www.w3.org/2001/04/xmlenc#' 
     elementFormDefault='qualified'> 

    <import namespace='http://www.w3.org/2000/09/xmldsig#' 
      schemaLocation='xmldsig-core-schema.xsd'/> 

in diesem xenc-Schema gibt es die Täter Datentyp:

<element name='EncryptedData' type='xenc:EncryptedDataType'/> 
    <complexType name='EncryptedDataType'> 
    <complexContent> 
     <extension base='xenc:EncryptedType'> 
     </extension> 
    </complexContent> 
    </complexType> 

ich habe versucht, diese Frage kürzer zu halten, lassen Sie mich wissen, wenn mehr Informationen benötigt werden, vielen dank für das Lesen.

Antwort

1

Der beste Weg, diese Art von Problemen zu diagnostizieren, ist die Installation eines HTTP-Debuggers. Zum Beispiel ist Fiddler eine gute, die für Sie arbeiten sollte. Es sollte Ihnen sagen, welche Ressource extern (im Internet) gelöst wird.

In Ihrem Fall ist wahrscheinlich der Schuldige die DTD in Ihrer xenc-schema.xsd Datei. Um es schnell zu beweisen, werden eingebettete DTDs einfach entfernt. Sobald Sie das Problem beweisen, können Sie einfach die bearbeiteten XSDs behalten oder einen benutzerdefinierten EntityResolver verwenden oder prüfen, ob Ihre bestimmte Bibliothek eine Eigenschaft besitzt, die Sie zum Deaktivieren der DTD-Verarbeitung einstellen können (was hier wirklich nutzlos ist).

+0

Scheint, dass das Entfernen des Doctype vollständig, mit der DTD den Trick. Danke für den Vorschlag. –

+0

@VladIlie, ich glaube, ich habe einen früheren Kommentar gesehen: keinen externen Traffic zu sehen. Nur um sicherzustellen, dass Sie für Java-Anwendungen Ihre Proxy-Informationen konfigurieren müssen - diese [link] (http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureJavaApp) könnte hilfreich sein. –

+0

Sie sind richtig, danke @PetruGardea –