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

标签 java xml

我有一个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/

相关文章:

java - 如何获取给定城市名称或地址的纬度和经度(java代码)?

java - TextView 不在应用程序中居中,但在 match_constraint 中居中

java - 应用程序在更新 Firebase 数据库中的数据时重启

java - Weblogic 无法部署 EJB javax.naming.NameAlreadyBoundException

java - 如何在运行时从 java 程序编译并运行 scala 代码?

javascript - 动态添加不同大小的数据集到Google Visualization Chart

xml - 从 Linux 上的 curl 命令结果中提取 xml 部分

xml - Hadoop 中解析 XML 的工具

java - 读取复杂的 XML Java

java - 在第二行的现有 xml 文件中添加 xml 样式表