我有这样的XML文件
<Customers>
<Customer Name="Test_91" Code="91" Purpose="Supplier" />
<Customer Name="Test_92" Code="92" Purpose="Receiver" />
</Customers>
我需要用java读取这个文件,我使用这样的代码:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class XMLReaderDOM {
public static void main(String argv[]) {
try {
File fXmlFile = new File("Customers.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("Customers");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Customer id : "
+ ((Element) eElement.getElementsByTagName("Customer").item(0)).getAttribute("Name"));
System.out.println("IataCode : "
+ ((Element) eElement.getElementsByTagName("Customer").item(0)).getAttribute("Code"));
System.out.println("IcaoCode : "
+ ((Element) eElement.getElementsByTagName("Customer").item(0)).getAttribute("Purpose"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但我没有得到第二记录的价值。这是客户“Test_92”的详细信息。
有人可以帮助我阅读N个客户的价值吗?
提前致谢!
答案 0 :(得分:2)
你正在绕过破旧的东西。
您获得了名为“customers”的元素列表(您只有其中一个)然后循环遍历它。
然后在循环中找到“customer”列表,取第一个条目然后提取属性(三次)。
您需要做的是,获取“客户”列表的第一个条目,然后获取“客户”列表并循环。
答案 1 :(得分:0)
尝试使用xPath。
您可以轻松地从节点跳转到节点。
XML:
<Customers>
<Customer name='f1'/>
<Customer name='f1'/>
<Customer name='f1'/>
</Customers>
爪哇:
Document xmlDocument = builder.parse(new FileInputStream("Customers.xml"));
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodeList = (NodeList) xPath.compile("/Customers/Customer").evaluate(xmlDocument, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++)
{
System.out.println(nodeList.item(i).getAttributes().getNamedItem("name").getNodeValue());
}
Outpot:
f1
f2
f3
答案 2 :(得分:0)
您将获得Customers标记列表,该列表仅在您的文档中。
试试这个,
NodeList nList = doc.getElementsByTagName("Customer");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Customer id : "
+ ( eElement.getAttribute("Name")));
System.out.println("IataCode : "
+ ( eElement.getAttribute("Code")));
System.out.println("IcaoCode : "
+ ( eElement.getAttribute("Purpose")));
答案 3 :(得分:0)
SimpleXml可以做到:
final String data = ...
final SimpleXml simple = new SimpleXml();
final Element customers = simple.fromXml(data);
for (final Element customer : customers.children) {
System.out.println(customer.attributes.get("Name"));
}
将输出:
Test_91
Test_92
从Maven Central:
<dependency>
<groupId>com.github.codemonstur</groupId>
<artifactId>simplexml</artifactId>
<version>1.4.0</version>
</dependency>