Xml nicht Parsen von String als Eingabe mit sax
Ich habe eine string Eingabe aus, die ich brauche, um zu extrahieren Sie einfach Informationen, hier ist die Beispiel-xml (aus mkyong):
<?xml version="1.0"?>
<company>
<staff>
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff>
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
Wie ich parse es in meinem code (ich habe ein Feld String name
in meiner Klasse) :
public String getNameFromXml(String xml) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean firstName = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("firstname")) {
firstName = true;
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (firstName) {
name = new String(ch, start, length);
System.out.println("First name is : " + name);
firstName = false;
}
}
};
saxParser.parse(xml.toString(), handler);
} catch (Exception e) {
e.printStackTrace();
}
return name;
}
Ich bin immer ein java.io.FileNotFoundException
und ich sehe, dass es versucht, eine Datei zu suchen myprojectpath + the entireStringXML
Was mache ich falsch?
Addon :
Hier ist meine main-Methode :
public static void main(String[] args) {
Text tst = new Text("<?xml version=\"1.0\"?><company> <staff> <firstname>yong</firstname> <lastname>mook kim</lastname> <nickname>mkyong</nickname> <salary>100000</salary> </staff> <staff> <firstname>low</firstname> <lastname>yin fong</lastname> <nickname>fong fong</nickname> <salary>200000</salary> </staff></company>");
NameFilter cc = new NameFilter();
String result = cc.getNameFromXml(tst);
System.out.println(result);
}
irgendeinem Grund insbesondere, warum kann man nicht schreiben, der xml-string in eine xml-Datei und parse diese Weise?
K. ja, denn ich Schreibe hive Benutzer-definierte Funktion (cwiki.apache.org/Hive/languagemanual-udf.html). Ich Suche paar Datensätze in nicht-relationale Datenbank, und jeder Datensatz hat ein kleines snipped von xml-gespeichert in einem Datensatz.
K. ja, denn ich Schreibe hive Benutzer-definierte Funktion (cwiki.apache.org/Hive/languagemanual-udf.html). Ich Suche paar Datensätze in nicht-relationale Datenbank, und jeder Datensatz hat ein kleines snipped von xml-gespeichert in einem Datensatz.
InformationsquelleAutor Gandalf StormCrow | 2012-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen Sie die Zeile
saxParser.parse(xml.toString(), handler);
mit den folgenden ein:vielen Dank, es hat mir sehr geholfen
InformationsquelleAutor Robert
Ich werde markieren Sie ein anderes Problem, das Sie wahrscheinlich zu schlagen, sobald Sie Lesen Ihre Datei korrekt.
Die Methode
nicht immer geben Sie die komplette text-element. Es ist die Freiheit, Euch das text-element (content -) - 'n' - Zeichen in einer Zeit. Von der doc:
So sollten Sie bauen Ihre text-string-element aus jeder Aufruf dieser Methode (z.B. mit einem
StringBuilder
) und nur interpret/speichern, dass der text, sobald die entsprechendenendElement()
- Methode aufgerufen wird.Dieser kann keinen Einfluss auf Sie jetzt. Aber es wird sich auf einige Zeit in der Zukunft - wahrscheinlich, wenn Sie es am wenigsten erwarten. Ich habe festgestellt es beim übergang von kleinen zu großen XML-Dokumenten, wo die Pufferung in der Lage war zu halten die ganze kleines Dokument, aber nicht die größeren.
Ein Beispiel (in pseudo-code):
endElement()
bitte. danke. Ich glaube, das ist wichtig, was du redestjetzt getan. Siehe oben für pseudocode.
danke für die Antwort, ist das richtig? justpaste.er/12w3 meinst du diesen (ich fügte hinzu, das endelement)
Ich kann nicht den Zugriff auf die Website für den moment. Vielleicht kann jemand anders überprüfen ?
Dies ist nicht fool-proof, da es gültiges XML zu begegnen, sind zusätzliche XML-Elemente--mit Ihrem eigenen text Zeichen--beim analysieren. In anderen Worten, man konnte sehen, startElement(), characters(), startElement(), characters(), endElement(), mehr Zeichen(), vor dem erreichen endElement(). Oder noch schlimmer. Also, halten Sie einen Stapel von builder-Puffer. Wenn Sie wissen, dass Ihre Daten nicht zeigen, dass Sie jedoch nicht haben, sich darum zu kümmern.
InformationsquelleAutor Brian Agnew
Mybe diese Hilfe. es nutzt javax.xml.Parser.DocumentBuilder, die einfacher als SAX
können Sie eine Schleife durch das Dokument durch die Verwendung von NodeList und überprüfen Sie jeden Knoten durch einen Namen
InformationsquelleAutor bitwave
Rufen Sie analysieren mit einem
String
als ersten parameter. Nach der Doku , string interpretiert wird, als dieURI
zu deiner Datei.Wenn Sie möchten, analysieren Sie Ihre
String
direkt, aber Sie haben, um es zu transformieren, um eineInputStream
in Erster Linie für die Verwendung mit derparse(InputSource is, DefaultHandler dh)
Methode (Doku):InformationsquelleAutor Sirko
Scheint, Sie nahm dieses Beispiel aus hier . Du musst eine Datei mit absoluten Pfad ein, nicht einen string zu Methode
SAXParser.parse()
; siehe das Beispiel eng. Die Methodeparse()
definiert als folgtWenn Sie wollen analysiert eine Zeichenfolge sowieso. Es gibt eine andere Methode, die nimmt
Inputstream
.Dann müssen Sie konvertieren string in einen InputStream. Hier ist wie es zu tun.
InformationsquelleAutor Santosh