#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);