Как получить значение XML-тега с разными атрибутами?

#java #xml #dom #attributes

#java #xml #dom #атрибуты

Вопрос:

Мне нужно получить значение из XML-тега с разными атрибутами.

Например: XML

 <metaData>
    <parameter name="HTTP-Method">POST</parameter>
    <parameter name="HTTP-URI">/loan/test?testArg=1234amp;amp;id=5555555</parameter>
    <parameter name="HTTP-Version">HTTP/1.1</parameter>
    <parameter name="Host">localhost:7002</parameter>
    <parameter name="Content-Length">0</parameter>
    <parameter name="Origin">chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop</parameter>
</netaData>
  

здесь мне нужно получить значение тега «parameter» с атрибутом «HTTP-Method»
, а другое — с атрибутом «HTTP-URI»

Это то, что я делаю:

 NodeList nodeList = document.getElementsByTagName("parameter");
for (int i = 0, size = nodeList.getLength(); i < size; i  ) {
        Element elem = (Element) nodeList.item(i);
  

Здесь я получил все теги параметров. Как я могу получить конкретное значение?

Комментарии:

1. Вы смотрели документацию , прежде чем задавать этот вопрос?

Ответ №1:

Этот блок кода

 for (int i = 0; i < nodeList.getLength(); i  ) {
    Element elem = (Element) nodeList.item(i);
    String attribute = elem.getAttribute("name");
    if ("HTTP-Method".equals(attribute) || "HTTP-URI".equals(attribute)) {
        System.out.println(elem.getTextContent());
    }
}
  

будет выводить

 POST
/loan/test?testArg=1234amp;id=5555555
  

Ответ №2:

С помощью библиотеки Dynamics amp; Java 8 это можно сделать довольно напрямую. Используя потоки и лямбды, мы можем проходить через xml довольно естественным образом.

 XmlDynamic example = new XmlDynamic("<metaData>"  
    "<parameter name="HTTP-Method">POST</parameter>"  
    "<parameter name="HTTP-URI">/loan/test?testArg=1234amp;amp;id=5555555</parameter>"  
"</metaData>");

String uri = example.get("metaData")
    .children()
    .filter(parameter -> parameter.get("@name").asString().equals("HTTP-URI"))
    .findAny()
    .map(parameter -> parameter.asString())
    .get(); // assuming this value is always there
  

Или, возможно, быть немного более защищенным, если xml менее гарантированно будет иметь то, что мы ожидаем.

 Optional<String> uri = example.get("metaData")
    .children()
    .filter(param -> param.get("@name").maybe().asString().orElse("").equals("HTTP-URI"))
    .findAny()
    .map(param -> param.asString());
  

Вы можете добавить библиотеку в свой проект maven с помощью

 <dependency>
  <groupId>com.github.alexheretic</groupId>
  <artifactId>dynamics</artifactId>
  <version>2.3</version>
</dependency>
  

Ответ №3:

Вы можете использовать пакет Scilca XML Progression, доступный на GitHub.

 List<Node> list = document.getElementsWithAttribute(new Attribute("Name", "HTTP-URI", true); // True cause the value of the attribute should be same

Node need = list.get(0);