我开始解析xml文档并有疑问:如何在Java上获取特定的XML元素参数值?
XML文档:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<keyword name="text123">
<profile num="1">
<url>http://www.a.com</url>
<field-1 param="">text</field-1>
<filed-2 param="">text</field-2>
</profile>
<profile num="2">
<url>http://www.b.com</url>
<field-1 param="">text</field-1>
<filed-2 param="">text</field-2>
</profile>
</keyword>
<keyword name="textabc123">
<profile num="1">
<url>http://www.1a.com</url>
<field-1 param="">text</field-1>
<filed-2 param="">text</field-2>
</profile>
<profile num="2">
<url>http://www.1b.com</url>
<field-1 param="">text</field-1>
<filed-2 param="">text</field-2>
</profile>
</keyword>
</data>
我在Java上写的代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
File xml_file=new File("file.xml");
if (xml_file.isFile() && xml_file.canRead()) {
Document doc = builder.parse(xml_file);
Element root = doc.getDocumentElement();
NodeList nodel = root.getChildNodes();
for (int a = 0; a < nodel.getLength(); a++) {
String data = /* code i don't know to write*/
System.out.println(data);
}
} else {}
我想出去控制台元素&#34;关键字&#34;参数&#34; name&#34;价值:
text123
和
text123abc
请帮助,谢谢。
答案 0 :(得分:5)
您可以使用XPath
InputStream is = getClass().getResourceAsStream("somefile.xml");
DocumentBuilderFactory xmlFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = xmlFactory.newDocumentBuilder();
Document xmlDoc = docBuilder.parse(is);
XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
String text123 = (String) xpath.evaluate("/data/keyword[1]/@name", xmlDoc, XPathConstants.STRING);
String textabc123 = (String) xpath.evaluate("/data/keyword[2]/@name", xmlDoc, XPathConstants.STRING);
答案 1 :(得分:5)
我将指导您如何使用JAXB进行操作。
首先,您的XML格式不正确。在少数几个地方你有filed
而不是field
。
适当的XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<keyword name="text123">
<profile num="1">
<url>http://www.a.com</url>
<field-1 param="">text</field-1>
<field-2 param="">text</field-2>
</profile>
<profile num="2">
<url>http://www.b.com</url>
<field-1 param="">text</field-1>
<field-2 param="">text</field-2>
</profile>
</keyword>
<keyword name="textabc123">
<profile num="1">
<url>http://www.1a.com</url>
<field-1 param="">text</field-1>
<field-2 param="">text</field-2>
</profile>
<profile num="2">
<url>http://www.1b.com</url>
<field-1 param="">text</field-1>
<field-2 param="">text</field-2>
</profile>
</keyword>
</data>
接下来,转到this website并下载Trang。
假设您的XML文件名为sample.xml
,请使用java -jar trang.jar sample.xml sample.xsd
通过Trang运行它以获取xml文件的xsd架构。
现在,运行xjc sample.xsd
(xjc是一个用于为XML模式生成Java类的工具,它与Java 6 SDK捆绑在一起。)
您将获得Java类列表:
generated\Data.java generated\Field1.java generated\Field2.java generated\Keyword.java generated\ObjectFactory.java generated\Profile.java
将它们放入Java项目文件中,并将sample.xml
放在程序可以找到的位置。现在,这就是获取关键字名称的方式:
JAXBContext context = JAXBContext.newInstance(Data.class);
Data data = (Data)context.createUnmarshaller().unmarshal(new File("sample.xml"));
List<Keyword> keywords = data.getKeyword();
for (Keyword keyword : keywords) {
System.out.println(keyword.getName());
}
这个方法在开始时可能看起来有些混乱,但如果你的XML结构没有改变,我觉得处理类型化Java对象比处理DOM本身更好。
答案 2 :(得分:4)
Node node = nodel.item(a);
if(node instanceof Element) {
data = ((Element)node).getAttribute("name");
System.out.println(data);
}
答案 3 :(得分:0)
节点列表包含节点,实际上是子接口的实例(元素,文本等)。
这段代码应该起作用:
Node node = nodel.item(a);
if (node instanceof Element) {
Element e = (Element) node;
System.out.println(e.getAttribute("name");
}