如何获取具有不同属性的XML标记的值?

时间:2016-10-09 12:50:56

标签: java xml dom attributes

我需要从具有不同属性的XML标记中获取值。

例如: XML

<metaData>
    <parameter name="HTTP-Method">POST</parameter>
    <parameter name="HTTP-URI">/loan/test?testArg=1234&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>

这里我需要获得tag&#34;参数&#34;的值。具有属性&#34; HTTP-Method&#34; 另一个具有属性&#34; HTTP-URI&#34;

我这样做:

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

这里我得到了所有的参数标签。我怎样才能得到具体的一个?

3 个答案:

答案 0 :(得分: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=1234&id=5555555

答案 1 :(得分:1)

使用图书馆Dynamics&amp; Java 8可以直接完成。使用Streams和lambdas,我们可以以相当自然的方式遍历xml。

XmlDynamic example = new XmlDynamic("<metaData>" +
    "<parameter name=\"HTTP-Method\">POST</parameter>" +
    "<parameter name=\"HTTP-URI\">/loan/test?testArg=1234&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>

答案 2 :(得分:0)

您可以使用GitHub上提供的Scilca XML Progression Package。

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