Разобрать ответ xml и посчитать элементы XML в CDATA - PullRequest
0 голосов
/ 19 марта 2019

У меня есть код, где я анализирую XML-ответ и подсчитываю вхождение элементов.Есть ли способ, которым я могу разобрать CDATA в ответе и посчитать элементы в CDATA.

Мой текущий код для разбора XML.

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                Document doc = docBuilder.parse(new InputSource(new StringReader(response.toString())));
                NodeList list = doc.getElementsByTagName("RESPONSE");
                System.out.println("Total : " + list.getLength());

Пример XML, который мне нужно проанализировать,

 <RESPONSE><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<ID>
  <EMAIL>xxx@yyy</EMAIL>
  <EMAIL>klihf@kjf</EMAIL>
  <EMAIL>ddd@fff</EMAIL>
  <EMAIL>@ddd</EMAIL>
  </ID>
 ]]></RESPONSE>

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Все, что находится между тегами RESPONSE, будет рассматриваться как строка. Попробуйте:

public class Main {
public static void main(String... args) {
    String response = "<RESPONSE><![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<ID>\n" +
            "  <EMAIL>xxx@yyy</EMAIL>\n" +
            "  <EMAIL>klihf@kjf</EMAIL>\n" +
            "  <EMAIL>ddd@fff</EMAIL>\n" +
            "  <EMAIL>@ddd</EMAIL>\n" +
            "  </ID>\n" +
            " ]]></RESPONSE>";
    String xml = response.substring(response.indexOf("<ID>"), response.lastIndexOf("]]>"));
    Id id = null;
    try {
        JAXBContext jc = JAXBContext.newInstance(Id.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource streamSource = new StreamSource(new StringReader(xml));
        JAXBElement<Id> element = unmarshaller.unmarshal(streamSource, Id.class);
        id = element.getValue();
    } catch (JAXBException ex) {
        ex.printStackTrace();
    }

    System.out.println(id.getEMAIL().size());
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "email"
})
@XmlRootElement(name = "ID")
public static class Id {

    @XmlElement(name = "EMAIL")
    private List<String> email;

    public List<String> getEMAIL() {
        if (email == null) {
            email = new ArrayList<>();
        }
        return this.email;
    }
}

}

0 голосов
/ 19 марта 2019

Вы можете сделать это, получив содержимое узла RESPONSE и продолжить таким же образом, как вы уже это делаете.

Например, добавив это в свой код,

String content = list.item(0).getTextContent();
Document doc_ = docBuilder.parse(new InputSource(new StringReader(content)));

NodeList listId = doc_.getElementsByTagName("ID");
System.out.println("Total (list ID) : " + listId.getLength());

NodeList listEmail = doc_.getElementsByTagName("EMAIL");
System.out.println("Total (list EMAIL) : " + listEmail.getLength());
...