gpt4 book ai didi

java - 如何基于节点读取Xml文件

转载 作者:行者123 更新时间:2023-12-01 09:25:11 26 4
gpt4 key购买 nike

我有一个java代码可以从xml文件中读取。有三个不同的节点 android、ios 和 web,我必须根据我指定的节点获取 HashMap 的键中的所有值,如果我指定 android,那么来自 android 的所有键值都应存储在 has 表中

我尝试使用代码,但发生空异常,任何人都可以帮助我解决这个问题

我的代码

public HashMap<String, String> readXML (String elementName)
throws ParserConfigurationException, SAXException, IOException {
HashMap<String, String> locator = new HashMap<>();
try {

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
File file = new File("XML.xml");
Document doc = dBuilder.parse(file);
NodeList nList = doc.getElementsByTagName("android");
Element fileElementactivity=(Element)nList.item(0);
NodeList nListactivity = fileElementactivity.getElementsByTagName("activity");
Element fileElementactivityname=(Element)nListactivity.item(1);
NodeList nListkeys = fileElementactivityname.getElementsByTagName("keys");
Element fileElementkey=(Element)nListkeys.item(0);
NodeList nListkey = fileElementkey.getElementsByTagName("key");


System.out.println(nListkey);
for (int j = 0; j < nListkey.getLength(); j++) {
Node columnNode = nListkey.item(j);
Element columnElement = (Element) columnNode;
Node data = columnElement.getElementsByTagName("name").item(0);
String name = "";
if (data != null) {
name = data.getTextContent();
if (name.contentEquals(elementName)) {
data = columnElement.getElementsByTagName("type").item(0);
String type = data.getTextContent();
data = columnElement.getElementsByTagName("value").item(0);
String value = data.getTextContent();
System.out.println(name + "******" + type + " : " + value);
locator.put(type, value);
}
}
}

System.out.println(locator.size());
} catch (Exception e) {
e.printStackTrace();
}

return locator;

}

和我的 xml

<object> 
<android>
<activity>
<activity-name>UserProfileLoginActivity</activity-name>
<keys>
<key>
<name>fake</name>
<type>index</type>
<value>0</value>
</key>
<key>
<name>fake</name>
<type>name</type>
<value>signIn</value>
</key>

</keys>
</activity>
</android>

<ios>
<activity>
<activity-name>UserProfileLoginActivity</activity-name>
<keys>
<key>
<name>fake</name>
<type>index</type>
<value>0</value>
</key>
<key>
<name>fake</name>
<type>name</type>
<value>signIn</value>
</key>

</keys>
</activity>
</ios>

<web>
<activity>
<activity-name>UserProfileLoginActivity</activity-name>
<keys>
<key>
<name>fake</name>
<type>index</type>
<value>0</value>
</key>
<key>
<name>fake</name>
<type>name</type>
<value>signIn</value>
</key>

</keys>
</activity>
</web>
</object>

最佳答案

如果你愿意远离直接的 org.w3c.dom.* 受虐狂,也许可以使用 Java 8 库 Dynamics可能有帮助。同样直接,但 null 安全且有帮助。

XmlDynamic example = new XmlDynamic(xmlStringOrReaderOrInputSourceEtc);

String target = "android";
Map<String, String> keyTypeToValue = example.get("object")
.get(target)
.get("activity|keys")
.children()
.collect(toMap(key -> key.get("type").asString(), key -> key.get("value").asString()));
// {name=signIn, index=0}

将其放入适用于“ios”、“web”等的方法中很简单。

关于java - 如何基于节点读取Xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39891486/

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