首页 > 解决方案 > java在xml文件中搜索特定属性名称

问题描述

我想在我的 xml 文件中搜索所有属性(名称)而不使用元素标记节点:

xml:

<test 1><test1/>
<test2> <test2/>
<test 3 id="aaa"> </test3>
<test 5> </test5>
<test 6 id="bbb" name="ijof"> </test6>

爪哇:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File(path));
root = document.getDocumentElement();

String attribut = root.getAttribute("name");
System.out.println(attribut); // Expected ijof

标签: javaxml

解决方案


您是否至少执行过一次代码?我不这么认为。否则,您肯定会注意到您的 XML 无法解析。

您的示例 XML 中有几个缺陷:

  1. 没有根元素。
  2. 错误的结束标签:应该是<test1></test1>而不是<test1><test1/>
  3. 元素名称不能包含空格,并且开始和结束标记必须匹配。它应该是<test5> </test5>而不是<test 5> </test5>

除此之外,您还可以使用 XPATH 获取具有name属性的所有元素。

这是一个将 XML 作为字符串的完整示例,但这应该无关紧要:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.IOException;
import java.io.StringReader;

public class FindNameAttribute {

  private static final String XML =
    "<root>\n" +
    "  <test1></test1>\n" +
    "  <test2> </test2>\n" +
    "  <test3 id=\"aaa\"> </test3>\n" +
    "  <test4 name=\"4\"/>\n" +
    "  <test5> </test5>\n" +
    "  <test6 id=\"bbb\" name=\"ijof\"> </test6>\n" +
    "  <test7 id=\"bbb\"><child name=\"childname\"/> </test7>\n" +
    "</root>\n";

  public static void main(String[] args) {
    System.out.println(XML);

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    try {
      builder = factory.newDocumentBuilder();
      StringReader reader = new StringReader(XML);
      InputSource source = new InputSource(reader);
      Document document = builder.parse(source);
      XPath xpath = XPathFactory.newInstance().newXPath();
      NodeList nodes = (NodeList) xpath.evaluate("//*[@name]", document, XPathConstants.NODESET);
      for(int i = 0; i < nodes.getLength(); i++) {
        Element el = (Element) nodes.item(i);
        String elementName = el.getTagName();
        String nameAttribute = el.getAttribute("name");
        System.out.println(String.format("Element name: %s, name attribute: %s", elementName, nameAttribute));
      }
    } catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException e) {
      e.printStackTrace();
    }
  }
}

这是输出:

<root>
  <test1></test1>
  <test2> </test2>
  <test3 id="aaa"> </test3>
  <test4 name="4"/>
  <test5> </test5>
  <test6 id="bbb" name="ijof"> </test6>
  <test7 id="bbb"><child name="childname"/> </test7>
</root>

Element name: test4, name attribute: 4
Element name: test6, name attribute: ijof
Element name: child, name attribute: childname

相关的 XPATH 表达式为://*[@name]

  • //:查找文档中的每个元素
  • *:元素名称的占位符。每个名字都匹配。
  • *[@name]:[]表示谓词。我们只想要具有 name 属性的元素。
  • @: 表示后面的名字是一个属性的名字。否则它将被解释为元素名称

推荐阅读