gpt4 book ai didi

java - 使用 XPath 将 XML 信息提取到 List

转载 作者:行者123 更新时间:2023-12-02 06:11:45 26 4
gpt4 key购买 nike

我有来自 SOAP 响应的 XML 数据,如下例所示:

<EMP>
<PERSONAL_DATA>
<EMPLID>AA0001</EMPLID>
<NAME>Adams<NAME>
</PERSONAL_DATA>
<PERSONAL_DATA>
<EMPLID>AA0002<EMPLID>
<NAME>Paul<NAME>
</PERSONAL_DATA>
</EMP>

我想将每个员工的信息存储在 Map(KEY,VALUE) KEY=tagname, VALUE=value 中并想要创建一个 LIST<MAP>对于所有在 java 中使用 XPATH 的员工。这是如何完成的?

我尝试了以下方法:

 public static List createListMap(String path, SOAPMessage response,Map map) {
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
try {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//" + path + "/*");
Object re =expr.evaluate(response.getSOAPBody(), XPathConstants.NODESET);
NodeList nodes = (NodeList)res;
for (int i = 0; i < nodes.getLength(); i++) {
if (nodes.item(i).getFirstChild() != null &&
nodes.item(i).getFirstChild().getNodeType() == 1) {
Map<String, Object> map1 = new HashMap<String, Object>();
map.put(nodes.item(i).getLocalName(), map1);
createListMap(nodes.item(i).getNodeName(), response,map1);
list.add(map);
}
else {
map.put(nodes.item(i).getLocalName(),nodes.item(i).getTextContent());
}
return list;
}

我调用了类似 createListMap("EMP",response,map); 的方法(响应是 SoapResponse)。当在 XPATH //PERSONAL_DATA/* 中时问题就来了。在递归中,它列出了有关两名员工的数据,但我想将每个员工的数据存储在自己的 map 中,然后创建这些 map 的列表...我该怎么做?

最佳答案

表达式 //PERSONAL_DATA/* 选择每个 PERSONAL_DATA 元素的所有子元素,从而导致您所描述的问题。相反,选择 PERSONAL_DATA 元素本身并迭代它们的子元素。

示例:

public NodeList eval(final Document doc, final String pathStr) 
throws XPathExpressionException {
final XPath xpath = XPathFactory.newInstance().newXPath();
final XPathExpression expr = xpath.compile(pathStr);
return (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
}

public List<Map<String, String>> fromNodeList(final NodeList nodes) {
final List<Map<String, String>> out = new ArrayList<Map<String,String>>();
int len = (nodes != null) ? nodes.getLength() : 0;
for (int i = 0; i < len; i++) {
NodeList children = nodes.item(i).getChildNodes();
Map<String, String> childMap = new HashMap<String, String>();
for (int j = 0; j < children.getLength(); j++) {
Node child = children.item(j);
if (child.getNodeType() == Node.ELEMENT_NODE)
childMap.put(child.getNodeName(), child.getTextContent());
}
out.add(childMap);
}
return out;
}

像这样使用:

List<Map<String, String>> nodes = fromNodeList(eval(doc, "//PERSONAL_DATA"));
System.out.println(nodes);

输出:

[{NAME=Adams, EMPLID=AA0001}, {NAME=Paul, EMPLID=AA0002}]

如果您实际上正在处理更复杂的结构,带有额外的嵌套元素(我怀疑您是这样),那么您需要单独迭代这些层或使用类似 JAXB 之类的东西对数据进行建模。 .

关于java - 使用 XPath 将 XML 信息提取到 List<Map>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com