java verwenden StAX um Kinder Elemente, die in a generic Mode
Ich versuche, mit StAX (habe schon ich es nicht mag....)
Es scheint, dass der einzige Weg, es zu benutzen ist, die durch kontinuierliche if-else-Bedingungen.
Aber die meisten wichtig es scheint, gibt es keine Möglichkeit, ordnen Sie ein element mit seinen Kindern, es sei denn man weiß vorher, die
Struktur des xml-Dokuments analysiert wird.Ist das richtig?
Ich habe versucht, die folgenden:
Ich habe das xml in einen String
<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\">
<ns1:A/>
<ns1:B>
<Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<Data>
<Author>John</Author>
<Edition>1</Edition>
<PubHouse>Small Publishing House</PubHouse>
<Price>37.8</Price>
</Data>
</Book>
</ns1:B>
</ns1:Root>
Möchte ich nutzen, StAX, um die "Book" - element, aber es scheint, ich kann nur code schreiben, der hat hardcoded allem die Struktur.
I. e. Verwenden XMLEventReader und einmal
Sie erhalten, Buch, start Schleife für Daten,Autor, etc.
Gibt es eine generic solution, die auf dieser?
Ich habe Folgendes versucht, um um dieses: ich habe versucht, gehen von String zu XMLEventReader und wieder zurück zum String, aber ich kann nicht die genaue String-Darstellung, die ich ursprünglich (die namespaces sind in Klammern, extra Doppelpunkte usw.).
StringBuilder xml = new StringBuilder();
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
String msg = "<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\"><ns1:A/><ns1:B><Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Data><Author>John</Author><Edition>1</Edition><PubHouse>Small Publishing House</PubHouse><Price>37.8</Price></Data></Book></ns1:B></ns1:Root>";
InputStream input = new ByteArrayInputStream(msg.getBytes("UTF-8"));
XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
while (xmlEventReader.hasNext())
{
XMLEvent event = xmlEventReader.nextEvent();
StringWriter sw = new StringWriter();
event.writeAsEncodedUnicode(sw);
xml.append(sw);
}
System.out.println(xml);
Bekomme ich die folgende:
<?xml version="1.0" encoding='UTF-8' standalone='no'?><['http://rootNameSpace.com/']:ns1:Root xmlns:ns1='http://rootNameSpace.com/'><['http://rootNameSpace.com/']:ns1:A></ns1:A><['http://rootNameSpace.com/']:ns1:B><['http://www.myNameSpace.com']::Book xmlns:='http://www.myNameSpace.com' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><['http://www.myNameSpace.com']::Data><['http://www.myNameSpace.com']::Author>John</Author><['http://www.myNameSpace.com']::Edition>1</Edition><['http://www.myNameSpace.com']::PubHouse>Small Publishing House</PubHouse><['http://www.myNameSpace.com']::Price>37.8</Price></Data></Book></ns1:B></ns1:Root>
Kann dieser Fall angesprochen werden, die über StAX oder DOM ist die einzige Lösung?
InformationsquelleAutor Cratylus | 2010-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht wirklich verstehen, was Sie versuchen zu tun, aber wenn Sie möchten, dass der lokale name des Tags, wodurch eine
START_ELEMENT
Ereignis, Sie können es so machen:Ebenso
asEndElement
,asCharacters
, etc bieten Zugriff auf andere Typen von Knoten.Persönlich, ich in der Regel feststellen, dass die
XMLStreamReader
ist praktischer für mich in den meisten Situationen, aber ich nehme an, das hängt vom use-case -, als auch Ihre eigenen persönlichen Vorlieben. Ein pro-Tipp, dass die verschärfte das schema, desto leichter die Daten zu Parsen mit StAX.Möglicherweise möchten Sie auch zu schauen, JAX-B für die automatische XML-Datenbindung.
Edit: Hier ist ein naiver rekursiver Abstieg StAX-parser für XML in der OP:
Schreiben Sachen wie diese macht nicht nur den code viel einfacher zu Lesen und zu Grunde geht, aber auch der stack-traces, wenn Fehler auftauchen.
Gut, um alle Ereignisse "von innen" ein element, das Sie gerade Lesen, Ereignisse, bis Sie eine gefunden haben mehr
END_ELEMENT
alsSTART_ELEMENT
Veranstaltungen. Aber das ist ein furchtbar DOMish Weg, es zu tun, was Sie wirklich wollen, zu tun, ist eine rekursive Abstieg parser liest alle Elemente auf und setzt Sie um einige domain-Objekt on-the-fly. Sorry für die miese Erklärung, aber das lernen zu nutzen StAX effektiv ist wirklich vor allem eine Frage treten die DOM sucht.vorgestellt so.By zu sagen "recursive descent parser" meinst du nicht verwenden StAX? Also StAX nicht bieten Ihnen diese ohne "hacks"?
Post editiert mit parser-Beispiel.
Ihnen sehr für Ihre Antwort!Meine große Sorge ist aber, dass dieser code ist spezifisch für das xml-Dokument Beispiel, das ich gepostet.Ich meine, man muss im Voraus wissen, die Struktur von xml-Dokumenten analysiert wird.Kann dieser code so modifiziert werden, dass als Allgemeine beliebigen xml-Dokument (D. H. ohne Kenntnis des Aufbaus im Voraus)?
InformationsquelleAutor gustafc
Es klingt wie Sie möglicherweise falsch entschieden haben tool hier: Stax ist eine tolle API für die effiziente Handhabung von großen Inhalt. Aber wenn Komfort wichtiger als Effizienz, ja, Sie sollten wahrscheinlich betrachten Sie einen Baum-Modell (DOM nicht unbedingt, XOM ist besser zum Beispiel) oder data binding (JAXB oder XStream). Speziell, Stax wie SAX sind stream-basiert, so dass Sie nur sehen, was ist das aktuelle Ereignis oder token. Es gibt keine Zugriffsmethoden für Kinder oder Eltern, denn es gibt keine garantierten Weg, um Sie zu bekommen, denn das ist nicht unbedingt möglich, unter Berücksichtigung der aktuellen stream-position.
Aber wenn performance-oder Speicher-Auslastung ein Problem sind, können Sie dennoch davon ausgehen, JAXB (das ist in der Regel effizienter als Baum-Modelle wie DOM), oder StaxMate. StaxMate ist high-performance, low-memory-usage-Erweiterung über Stax, und ist etwas bequemer zu bedienen.
Während Sie noch brauchen, um die Iteration über die Elemente im Dokument, um seine cursor Ansatz maps mehr natürlich mit den Eltern-dann-Kinder-lookups. So funktioniert es möglicherweise für Ihren Fall.
InformationsquelleAutor StaxMan