Wie zu analysieren innerhalb von CDATA in XML mit Java
Auf der Suche durch die bestehenden CDATA Diskussionen, keine, die ich fand, waren in der Lage zu erreichen, was ich bin versucht.
Ist es möglich zu analysieren, innerhalb von CDATA-wo der tag ist nicht einzigartig?
Nachfolgend ist das XML-Dokument, wo ich bin, den Abruf jedes Feld innerhalb der CDATA-block, der mehrere Felder von Interesse (D. H. Daten Geladen, Qualität, Status, Index) in Zeile 5 unten. Jedes Feld ist gekennzeichnet mit dem "li" - tag innerhalb des CDATA-Blocks (auch wenn es ein Zeichen, Daten, Speicherplatz):
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<name>area Area Date: 2014-07-31</name>
<Placemark><name>P07L327</name><Point><coordinates>-96.26879,85.19125</coordinates></Point><description><![CDATA[<ol><li> Data Loaded: NO</li><li>Quality: 5</li><li>Status: UP</li><li>Index: 72</li></eol>]]></description><Style> id = "colorIcon"</Style></Placemark>
<coordinates>-96.26879,85.19125,0 -96.26879,85.19125,0 -96.26879,85.19125,0 -96.26879,85.19125,0 -96.26879,45.14698,0 </coordinates>
</Document>
</kml>
Aktuell Ausgabe wie diese:
Name: <ol><li> Data Loaded: NO</li><li>Quality: 5</li><li>Status: UP</li><li>Index: 72</li></eol>
INNERHALB der CDATA-block, meine Absicht ist die Ausgabe eine neue Zeile für jedes Feld zusammen mit seinem jeweiligen Ergebnis.
Unten ist der code, der geschrieben bis jetzt, gibt die aktuelle Ausgabe oben aufgeführten:
package com.lucy.seo;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.CharacterData;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class ReadXMLFile {
public static void main(String[] args ) throws Exception {
File fXmlFile = new File("C:/XML_UltraEdit/XML_Sandbox/Oracle_Java_Project/Test_Doc.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("Placemark");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Element element = (Element) nList.item(temp);
NodeList name = element.getElementsByTagName("description");
Element line = (Element) name.item(0);
System.out.println("Name: " + getCharacterDataFromElement(line));
}
}
public static String getCharacterDataFromElement(Element f) {
NodeList list = f.getChildNodes();
String data;
for(int index = 0; index < list.getLength(); index++){
if(list.item(index) instanceof CharacterData){
CharacterData child = (CharacterData) list.item(index);
data = child.getData();
if(data != null && data.trim().length() > 0)
return child.getData();
}
}
return "";
}
}
Freuen uns über jede Hilfe in diese Richtung! -- vielen Dank!
Sep 2, 2014-update
Aktualisiert Bearbeiten mit der definitiven Lösung. Vielen Dank an alle hier, die Lösungen gepostet und geholfen. Lösung war aufgeteilt in zwei Stücke von code /Dateien aufgrund der library-Konflikte:
//First file which is input to the second file followed afterwards
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ReadXMLFile {
public static void main(String[] args ) throws Exception {
PrintStream out = new PrintStream(new FileOutputStream("C:/XML_UltraEdit/XML_Sandbox/NetBeans_Java_Project/temp_file.html"));
System.setOut(out);
File fXmlFile = new File("C:/XML_UltraEdit/XML_Sandbox/NetBeans_Java_Project/raw_input.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(fXmlFile);
//optional, but recommended
//read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Placemark");
//create a buffered reader that connects to the console, we use it so we can read lines
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("<html xlmns=http://www.w3.org/1999/xhtml>");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
Element eElement = (Element) nNode;
Element element = (Element) nList.item(temp);
NodeList name = element.getElementsByTagName("description");
Element line = (Element) name.item(0);
System.out.println("<bracket><li>Name: " + eElement.getElementsByTagName("name").item(0).getTextContent() + "</li>");
System.out.println("<description>Description: " + getCharacterDataFromElement(line) + "</description></bracket>");
}
System.out.println("</html>");
//read a line from the console
String lineFromInput = in.readLine();
//output to the file a line
out.println(lineFromInput);
out.close();
}
public static String getCharacterDataFromElement(Element f) {
NodeList list = f.getChildNodes();
String data;
for(int index = 0; index < list.getLength(); index++){
if(list.item(index) instanceof CharacterData){
CharacterData child = (CharacterData) list.item(index);
data = child.getData();
if(data != null && data.trim().length() > 0)
return child.getData();
}
}
return "";
}
}
//Second File
package ReadXMLFile_part2;
import java.io.*;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ReadXMLFile_part2 {
public static void main(String[] args) throws Exception {
PrintStream out = new PrintStream(new FileOutputStream("C:/XML_UltraEdit/XML_Sandbox/NetBeans_Java_Project/PA-PTH013_Output_Meters.xml"));
System.setOut(out);
System.out.println("*** JSOUP ***");
File input = new File("C:/XML_UltraEdit/XML_Sandbox/NetBeans_Java_Project/temp_file.html");
Document doc = null;
try {
doc = Jsoup.parse(input,"UTF-8", "http://www.w3.org/1999/xhtml" );
} catch (IOException ex) {
Logger.getLogger(ReadXMLFile_part2.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Elements brackets = doc.getElementsByTag("bracket");
for (Element bracket : brackets) {
Elements lis = bracket.select("li");
for (Element li : lis){
System.out.println(li.text());
}
break;
}
System.out.println();
//read a line from the console
String lineFromInput = in.readLine();
//output to the file a line
out.println(lineFromInput);
out.close();
}
}
CDATA
ist, dass es definiert als einfache Zeichendaten, die nicht geparst wird, durch ein XML-reader =)Danke, aber wie kann ich parse den text durch mit dem XML-tag den li-Elementen? Der nächste, den ich fand, war dieser: [link] stackoverflow.com/questions/12889253/...
Sie wissen bereits, wie zu bekommen, dass CDATA-Daten als unformatierte Daten, so dass der trick ist, verwenden Sie einen zweiten parser (dann aber ein HTML-parser, nicht-XML-parser), und führen Sie Ihre CDATA-string durch.
Danke, ich habe am Ende mit einem zweiten parser (mit HTML), wie du gesagt hast und hat funktioniert, aber lief in ein anderes Thema. Ich habe das volle problem in einem anderen thread hier: [link] (stackoverflow.com/questions/25491424/...)
InformationsquelleAutor stitch70 | 2014-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
CDATA
ist ein marker, um XML-Interpretation-Motoren, dass das, was Sie begegnen im zwischen start und Ende sollten so behandelt werden, als "pure" (raw) Charakter-Daten.So, in einer Weise, es ist wie ein escape-Zeichen für den parser (ein kann, umfassen viele Zeichen).
Daher, Sie finden nicht, dass ein XML-parser, der berichten wird, was im Innern eines CDATA-wie XML, weil die norm sagt, dass Sie es melden MUSS, die es als ein Zeichen stream. (Als Folge : es MUSS NICHT interpretieren es als XML-stream, der ist wirklich gut, denn nichts Mandate der Inhalte, XML ist zwar).
Sowieso, Ihr parser und Ihr code wie erwartet funktioniert.
Aber wenn, wie in Ihrem Fall, Sie geschehen, zu wissen, dass der Inhalt einer bestimmten CDATA-Instanz ist in der Tat eine gültige XML-Instanz, dann öffnen Sie einen neuen Parser für diese genauen Inhalt und befassen sich mit it-Einsatz.
So können Sie sich die Ausgabe Ihres
getCharacterDataFromElement(line)
rufen, füttern Sie, um IhredocumentBuilder
, und verwenden Sie diese neueDocument
Instanz zu analysieren, die Inhalte Ihrerli
Elemente.Wenn Sie waren auf der Suche nach
placemark
Sie schrieb eine "for" - Schleife, um herauszufinden, "alle Elemente von (dass) tag-name". Gut, Sie würde das gleiche tun, wenn Sie sind auf der Suche fürli
. Mit dem Unterschied, dass Ortsmarkierung zugeordnet wurde, nur einmal, aber li übereinstimmen würde mehrere.InformationsquelleAutor GPI
Ihre Frage ist so etwas ein Widerspruch, da CDATA ist eine explizite Anweisung an den parser NICHT analysiert, was es sieht im inneren des CDATA. So ist der einfachste Weg, um den Inhalt analysiert, ist nicht zu zählen die CDATA-tags in den ersten Platz.
Jedoch gesagt, dass der parser nicht Parsen von CDATA-Inhalt, was Sie tun können, ist, extrahieren Sie die Inhalte als text, und dann schicken Sie den text an den parser wie eine zweite Analysevorgang.
Tut mir Leid, ich verstehe nicht, Ihre Frage.
Nach dem extrahieren der CDATA-Inhalt als text wie bereits erwähnt, wie soll ich das extrahieren von XML-tags, die den gleichen tag-Namen (<li>)? Das Beispiel ist in Zeile 5 der ersten code-snippet oben thks
InformationsquelleAutor Michael Kay