Cómo analizar un XML que tiene datos incluidos en <![CDATA[---]...
¿cómo podemos analizar el xml y obtener los datos incluidos en CDATA
???Cómo analizar XML para <![CDATA[]]>
Respuesta
public static void main(String[] args) throws Exception {
File file = new File("data.xml");
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//if you are using this code for blackberry xml parsing
builder.setCoalescing(true);
Document doc = builder.parse(file);
NodeList nodes = doc.getElementsByTagName("topic");
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList title = element.getElementsByTagName("title");
Element line = (Element) title.item(0);
System.out.println("Title: " + getCharacterDataFromElement(line));
}
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
(http://www.java2s.com/Code/Java/XML/GetcharacterdataCDATAfromxmldocument.htm)
Prefiero hacer algo como: if (child! = Null && (instancia infantil de CharacterData)) { return ((CharacterData) child) .getData(); } else { return e.getNodeValue(); } Para manejar sin problemas la presencia/ausencia de bloque CDATA. –
¿Puede proporcionar algún texto para describir lo que está haciendo y por qué usaría 'DocumentBuilderFactory'? – Gray
En la implementación actual de DOM de Java, puede acceder a CDATA simplemente como datos de texto usando 'e.getTextContent()'. [Ver ejemplo] (http://stackoverflow.com/questions/42802202) sin verificación de tipo, lanzamiento, 'e.getData()'. – jschnasse
CDATA
solo dice que los datos incluidos no se deben escapar. Entonces, solo toma el texto de la etiqueta. El analizador XML debe devolver los datos claros sin CDATA
.
obteniendo los datos de texto: e.getTextContent(); –
aquí r.get().getResponseBody()
es el cuerpo de la respuesta
Document doc = getDomElement(r.get().getResponseBody());
NodeList nodes = doc.getElementsByTagName("Title");
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList title = element.getElementsByTagName("Child tag where cdata present");
Element line = (Element) title.item(0);
System.out.println("Title: "+ getCharacterDataFromElement(line));
public static Document getDomElement(String xml) {
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setCoalescing(true);
dbf.setNamespaceAware(true);
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
Puesto que todas las respuestas anteriores están utilizando un enfoque basado en DOM. Esta es la forma de analizar CDATA con un enfoque basado en flujo usando STAX.
Utilice el siguiente patrón:
switch (EventType) {
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.CDATA:
System.out.println(r.getText());
break;
default:
break;
}
muestra completa:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
public void readCDATAFromXMLUsingStax() {
String yourSampleFile = "/path/toYour/sample/file.xml";
XMLStreamReader r = null;
try (InputStream in =
new BufferedInputStream(new FileInputStream(yourSampleFile));) {
XMLInputFactory factory = XMLInputFactory.newInstance();
r = factory.createXMLStreamReader(in);
while (r.hasNext()) {
switch (r.getEventType()) {
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.CDATA:
System.out.println(r.getText());
break;
default:
break;
}
r.next();
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (r != null) {
try {
r.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
Con /path/toYour/sample/file.xml
<data>
<![CDATA[ Sat Nov 19 18:50:15 2016 (1672822)]]>
<![CDATA[Sat, 19 Nov 2016 18:50:14 -0800 (PST)]]>
</data>
Da:
Sat Nov 19 18:50:15 2016 (1672822)
Sat, 19 Nov 2016 18:50:14 -0800 (PST)
- 1. ¿Cómo uso Nokogiri :: XML :: Reader para analizar grandes archivos XML?
- 2. Cómo analizar XML de SOAP?
- 3. Cómo analizar XML utilizando jQuery?
- 4. Cómo analizar XML en php?
- 5. Usando XPath para analizar un documento XML
- 6. Nodo para analizar xml usando xml2js
- 7. Script Perl para analizar XML utilizando XML :: LibXML;
- 8. Ayuda para analizar XML con DOMDocument
- 9. expresión regular para analizar XML en .NET
- 10. xml.parsers.expat.ExpatError al analizar XML
- 11. ¿Qué significa analizar XML?
- 12. Cómo analizar atributos xml con jQuery solo?
- 13. cómo pasar un archivo xml a lxml para analizar?
- 14. Cómo analizar el archivo XML en RapidXML
- 15. Perl, cómo analizar el archivo XML, xpath
- 16. Cómo analizar XML mal formado en Java?
- 17. Cómo analizar XML utilizando el analizador SAX
- 18. Cómo analizar XML entre dominios en jQuery?
- 19. Cómo analizar una cadena XML en Qt
- 20. php cadena de analizar XML
- 21. ¿Analizar espacios de nombres XML?
- 22. Python - ¿Qué es más rápido para analizar Json o XML?
- 23. Compatibilidad con Python ElementTree para analizar entidades XML desconocidas
- 24. XML para IEnumerable <T>
- 25. Android: analizar XML de problemas de cadena
- 26. Analizar archivo XML local en Android
- 27. ¿Puede Python xml ElementTree analizar un archivo xml muy grande?
- 28. analizar un archivo XML en Qt
- 29. ¿Cuáles son los principales métodos/bibliotecas disponibles para analizar XML?
- 30. alternativas a simpleXML para analizar archivos xml con PHP
¿Analiza el archivo "a mano" o le utiliza cualquier clase XMLReader (y cuál)? – Thargor