Wie legen schemalocation in ein xml-Dokument per DOM
erstelle ich ein xml-Dokument mit JAXP und Suche einen Weg, um legen Sie die schemalocation.
Im moment ist meine Anwendung erzeugt:
<?xml version="1.0" encoding="UTF-8"?>
<root>
...
</root>
Aber ich brauche:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="namespaceURL"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="namespaceURL pathToMySchema.xsd">
...
</root>
Mein code:
StreamResult result = new StreamResult(writer);
Document doc = getDocument();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.setOutputProperty(OutputKeys.METHOD, "xml");
trans.setOutputProperty(OutputKeys.VERSION, "1.0");
trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
DOMSource source = new DOMSource(depl.getAsElement(doc));
trans.transform(source, result);
Vielen Dank für Ihre Zeit,
Kasten
InformationsquelleAutor kasten | 2011-02-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
In XML data model-namespace-Knoten sind tatsächlich nicht gelesen, aus übergeordneten element, sondern jedes element hat seine eigenen namespace-Knoten. Daher einfach hinzufügen eine neue Standard-namespace root-element nicht funktioniert, aber die Ergebnisse in einem Dokument wie diesem
Bemerken das erscheinen der leeren default-namespace
xmlns=""
auf das Kind-element(en). Was eigentlich getan werden muss, ändern Sie den namespace von jedem Knoten vor oder erstellen Sie ein neues Dokument mit den gewünschten Standard-namespace und kopieren Sie den Inhalt, element-und Attribut-Namen etc. von dem alten Dokument in das neue. Diese kann getan werden, indem rekursiv Durchlaufen des ursprünglichen Dokuments. Mit Java DOM Implementierung kann mühsam ist, habe ich gehört. Ein kurzer Schnitt könnte sein, Lesen Sie das Dokument mit namespace-nicht bewusst, DOM und fügen Sie als Attribut der neuen Standard-namespace. Andere Lösung ist, um den namespace zu ändern, die mit einer XSLT-transformation, die scheint mir Recht geeignet, in diesem Fall, da Sie eigentlich schon generieren der Ausgabe mittels XSLT-transformation.Hilfe dieser XSLT-stylesheet hinzufügen eine neue Standard-Namensraum und schema-Standort, um das root-element. Dieses stylesheet bewahrt alte namespaces, aber fügt alle Elemente zu neuen default-namespace, wenn Sie zuvor in nicht-namespace.
Erstellen, anstatt den Transformator mit
(die erstellt und stylesheet, das macht eine identy-transformation) erstellen Sie ein XSLT-input-Quelle, und geben Sie es als parameter an
newTransformer()
wo
xsltFile
ist einFile
Objekt zeigt auf, dass die XSLT-Datei.Stellen Sie die output-Eigenschaften, wie Sie wünschen und rufen Sie
transform()
wie in deinem Beispiel-code. Das Ergebnis sollte sein, was Sie gewünscht, aber ich habe nicht getestet, die in Java. Die angegebene XSLT-Datei ist getestet für einige triviale Fälle und es ist ein Beispiel für die Eingabe und Ausgabe am Ende dieser Antwort.Einige kleinere Hinweise:
transform()
Methode.xsi:
, nichtxs:
wie in deinem Beispiel-code (xs:
verwendet wird, in schema-Definitionen (sowiexsd:
)) .Beispiel für die Eingabe und Ausgabe für die ein XSLT-stylesheet, das oben gezeigt wird,
Eingang:
Ausgabe:
InformationsquelleAutor jasso
Können Sie die namespaces in der Wurzel, wenn das Dokument erstellen.
Dann für jedes element Hinzugefügt, um das Dokument anstelle von createElement() verwenden createElementNS()
Diese Ergebnisse in dem, was Sie gesucht haben.
InformationsquelleAutor teknopaul
Hier ist, wie, einen Hinweis zu geben, um den parser, um Ihr problem zu lösen:
http://bytes.com/topic/java/answers/16892-xerces-how-perfrom-schema-validations-without-using-xsi-schemalocation
Geht es so:
Hier ist eine Validierung Beispiel mit einigen source-code. Es könnte Ihnen helfen.
http://www.ibm.com/developerworks/xml/library/x-tipvalschm/
(Wenn alles kommt noch schlimmer, können Sie immer suchen-und-ersetzen. Ich weiß, es ist nicht die ideale Lösung, aber die javax.xml.verwandeln.OutputKeys scheint nicht auf ein Mitglied bezogen auf das Attribut schemalocation.)
InformationsquelleAutor Rodrigo Hahn