Jak przeanalizować XML zawierający dane zawarte w <![CDATA[---]...
jak możemy przeanalizować xml i uzyskać dane zawarte w CDATA
???Jak przeanalizować kod XML dla <![CDATA[]]>
Odpowiedz
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)
Wolałbym zrobić coś w stylu: if (child! = Null && (child instanceof CharacterData)) { return ((CharacterData) child) .getData(); } else { return e.getNodeValue(); } Aby płynnie obsługiwać obecność/brak bloku CDATA. –
Czy możesz podać tekst opisujący to, co robisz i dlaczego używałbyś 'DocumentBuilderFactory'? – Gray
W obecnej implementacji DOM DOM można uzyskać dostęp do CDATA po prostu jako dane tekstowe za pomocą 'e.getTextContent()'. [Zobacz przykład] (http://stackoverflow.com/questions/42802202) bez sprawdzania typu, cast, 'e.getData()'. – jschnasse
CDATA
mówi tylko, że zawarte w nim dane nie powinny zostać usunięte. Więc po prostu weź tekst tagu. Analizator składni XML powinien zwracać czyste dane bez numeru CDATA
.
uzyskiwanie danych tekstowych: e.getTextContent(); –
tutaj r.get().getResponseBody()
jest organem odpowiedź
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 "";
}
Ponieważ wszystkie poprzednie odpowiedzi używasz DOM podejście oparte. W ten sposób można sparsować CDATA za pomocą podejścia opartego na strumieniu przy użyciu STAX.
kliknąć na poniższy wzór:
switch (EventType) {
case XMLStreamConstants.CHARACTERS:
case XMLStreamConstants.CDATA:
System.out.println(r.getText());
break;
default:
break;
}
Kompletna próbka:
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);
}
}
}
}
Z /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>
Daje:
Sat Nov 19 18:50:15 2016 (1672822)
Sat, 19 Nov 2016 18:50:14 -0800 (PST)
- 1. Jak rozszyfrować kod XML z XQuery?
- 2. Jak przeanalizować usługę WWW XML w Swift?
- 3. Jak zapisać kod HTML w pliku XML, używając Linq do XML?
- 4. Intellij IDEA CE 12 Kod XML Kod XML nie działa
- 5. Jak uzyskać XML z nagłówkiem (<? Xml version = "1.0" ...)?
- 6. Jak przeanalizować tablicę numpy?
- 7. Jak przeanalizować plik YAML?
- 8. Nie można przeanalizować komunikatu XML za pomocą JAXB org.springframework.oxm.UnmarshallingFailureException
- 9. Jak wysłać zwykły kod XML w odpowiedzi SOAP?
- 10. Android: jak uzyskać niestandardowy kod XML rozpoznawany
- 11. Jak to przeanalizować? ftpWebRequest ListDirectorDetials
- 12. Czy <%: i <% = samo jak kod embbed (wyrażenie) Bloki
- 13. Jak przeanalizować ciąg do BigDecimal?
- 14. ReSharper - jak ponownie przeanalizować rozwiązanie?
- 15. C# List <> XML
- 16. Jak przeanalizować ASN.1 z Haskellem?
- 17. Jak używać FOR XML w podzapytaniach?
- 18. serializacji XML z listy <T> - XML głównej
- 19. Ponownie wykorzystaj kod TextView w Androidzie XML
- 20. XML do IEnumerable <T>
- 21. Jak dodać istniejący ciąg Xml do XElement
- 22. Groovy XML MarkupBuilder nie tworzy korzeń <?xml .... ?>
- 23. Skrót Eclipse do komentowania jsp, kod xml
- 24. operator << dla QString
- 25. Jak serializować/dekantalizować słownik <ciąg, obiekt> do XML
- 26. Android jak zidentyfikować audio/wideo z xml?
- 27. Spray-Json: Jak przeanalizować układ Json?
- 28. Jak napisać Niecytowany XML zewnątrz z CDATA
- 29. pisząc kilka znaków takich jak „<” w pliku xml
- 30. Jak najlepiej zaktualizować węzeł XML w MSBuild
Czy analizujesz plik "ręcznie" lub używasz dowolnej klasy XMLReader (i która)? – Thargor