java - 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
解决方案
您是否至少执行过一次代码?我不这么认为。否则,您肯定会注意到您的 XML 无法解析。
您的示例 XML 中有几个缺陷:
- 没有根元素。
- 错误的结束标签:应该是
<test1></test1>
而不是<test1><test1/>
。 - 元素名称不能包含空格,并且开始和结束标记必须匹配。它应该是
<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 属性的元素。@
: 表示后面的名字是一个属性的名字。否则它将被解释为元素名称
推荐阅读
- signature - Bro IDS signature_match 触发器
- javascript - 旋转包含的图像后,div 高度未正确设置
- angular - Angular,TypeError:无法读取 null 的属性“任务”
- java - 调用时如何处理其他模块自定义异常
- angular - Ionic 3 Angular 4 App 在产品发布版本上抛出错误
- php - 如何在 Yii2 urlManager 中为默认页面创建干净的 url
- javascript - JQuery 调用在我的 AngularJS 页面中不起作用
- c# - 无法在 C# 中使用集合初始化程序错误初始化十进制类型
- javascript - 如何查找数组是否有其他元素?
- sendgrid - 如何在 sendgrid node.js v3 客户端中将 pdf 文件作为附件发送