java - 用java解析xml DOM子节点

标签 java xml dom xml-parsing

我有以下的xml结构

<entities>
        <entity>
            <type>FieldTerminology</type>
            <relevance>0.732316</relevance>
            <sentiment>
                <type>negative</type>
                <score>-0.351864</score>
            </sentiment>
            <count>2</count>
            <text>financial crisis</text>
        </entity>
        <entity>
            <type>Company</type>
            <relevance>0.496572</relevance>
            <sentiment>
                <type>neutral</type>
            </sentiment>
            <count>1</count>
            <text>Goldman Sachs</text>
            <disambiguated>
                <name>Goldman Sachs</name>
                <subType>CompanyShareholder</subType>
                <website>http://www.gs.com/</website>
                <dbpedia>http://dbpedia.org/resource/Goldman_Sachs</dbpedia>
                <freebase>http://rdf.freebase.com/ns/m.01xdn1</freebase>
                <yago>http://yago-knowledge.org/resource/Goldman_Sachs</yago>
                <crunchbase>http://www.crunchbase.com/company/goldman-sachs</crunchbase>
            </disambiguated>
        </entity>

我正在解析所有,只有我无法访问子情感 有了这个,我怎样才能访问每个实体节点中的“情绪”?

 NodeList feeds = docs.getElementsByTagName("entities");
            for (int i = 0; i < feeds.getLength(); i++) {
                Node mainNode = feeds.item(i);
                if (mainNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element firstElement = (Element) mainNode;
                    System.out.println("First element " + firstElement.getTagName());
                    NodeList forumidNameList = firstElement.getElementsByTagName("entity");

                    for (int j = 0; j < forumidNameList.getLength(); ++j) {
                        Element value = (Element) forumidNameList.item(j);

                        NodeList conditionList = value.getElementsByTagName("relevance");
                        for (int k = 0; k < conditionList.getLength(); ++k) {
                            Element condition = (Element) conditionList.item(k);
                            String conditionText = condition.getFirstChild().getNodeValue();
                            System.out.println("relevance " + conditionText);
                        }
                        NodeList conditionList1 = value.getElementsByTagName("type");
                        for (int k = 0; k < conditionList1.getLength(); ++k) {
                            Element condition = (Element) conditionList1.item(k);
                            String conditionText = condition.getFirstChild().getNodeValue();
                            System.out.println("type " + conditionText);
                        }
                        NodeList conditionList2 = value.getElementsByTagName("count");
                        for (int k = 0; k < conditionList2.getLength(); ++k) {
                            Element condition = (Element) conditionList2.item(k);
                            String conditionText = condition.getFirstChild().getNodeValue();
                            System.out.println("count " + conditionText);
                        }
                        NodeList conditionList3 = value.getElementsByTagName("text");
                        for (int k = 0; k < conditionList3.getLength(); ++k) {
                            Element condition = (Element) conditionList3.item(k);
                            String conditionText = condition.getFirstChild().getNodeValue();
                            System.out.println("text " + conditionText);
                        }

我需要实体和子节点的解析列表。

最佳答案

我试图让你的问题得到解决,我做了以下更改 1. 新增<sentiment> 缺失节点解析 2. 改进了 <type> 的解析逻辑节点,因为它会因为 dom 结构中的同名出现两次。

注意:我仍然建议使用 JAXB、XPath 来进行高效的 xml 解析。希望有帮助 这是代码。

    NodeList feeds = doc.getElementsByTagName("entities");
    for (int i = 0; i < feeds.getLength(); i++) {
        Node mainNode = feeds.item(i);
        if (mainNode.getNodeType() == Node.ELEMENT_NODE) {
            Element firstElement = (Element) mainNode;
            System.out.println("First element "
                    + firstElement.getTagName());
            NodeList forumidNameList = firstElement
                    .getElementsByTagName("entity");

            for (int j = 0; j < forumidNameList.getLength(); ++j) {
                Element value = (Element) forumidNameList.item(j);

                NodeList conditionList = value
                        .getElementsByTagName("type");
                for (int k = 0; k < conditionList.getLength(); ++k) {
                    Element condition = (Element) conditionList.item(k);
                    if (condition.getParentNode().getNodeName()
                            .equals("entity")) {
                        String conditionText = condition
                                .getFirstChild().getNodeValue();
                        System.out.println("type " + conditionText);

                    }
                }
                NodeList conditionList1 = value
                        .getElementsByTagName("relevance");
                for (int k = 0; k < conditionList1.getLength(); ++k) {
                    Element condition = (Element) conditionList1
                            .item(k);
                    String conditionText = condition.getFirstChild()
                            .getNodeValue();
                    System.out.println("relevance " + conditionText);
                }
                NodeList conditionList2 = value
                        .getElementsByTagName("sentiment");
                for (int k = 0; k < conditionList2.getLength(); ++k) {
                    Element condition = (Element) conditionList2
                            .item(k);
                    for (int l = 0; l < condition.getChildNodes()
                            .getLength(); ++l) {
                        Element condition2 = (Element) condition
                                .getChildNodes().item(l);
                        String conditionText = condition2
                                .getFirstChild().getNodeValue();
                        System.out
                                .println("sentiment " + conditionText);
                    }
                }
                NodeList conditionList3 = value
                        .getElementsByTagName("count");
                for (int k = 0; k < conditionList3.getLength(); ++k) {
                    Element condition = (Element) conditionList3
                            .item(k);
                    String conditionText = condition.getFirstChild()
                            .getNodeValue();
                    System.out.println("count " + conditionText);
                }
                NodeList conditionList4 = value
                        .getElementsByTagName("text");
                for (int k = 0; k < conditionList4.getLength(); ++k) {
                    Element condition = (Element) conditionList4
                            .item(k);
                    String conditionText = condition.getFirstChild()
                            .getNodeValue();
                    System.out.println("text " + conditionText);
                }
            }
        }
    }
output
----------------
First element entities
type FieldTerminology
relevance 0.732316
sentiment negative
sentiment -0.351864
count 2
text financial crisis
type Company
relevance 0.496572
sentiment neutral
count 1
text Goldman Sachs

关于java - 用java解析xml DOM子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451908/

相关文章:

java - 房间数据库强制 OnCreate 回调

php - 调用未定义函数xmlwriter_open_memory(),无OOP

xml - 我需要帮助从 XML 读取状态字段

javascript - 无法使用 jQuery animate() 使元素对 Angular 移动

java - 将 hibernate 实体转换为 JSON : oblectId instead of whole object

java - 批量从 Redis 中获取数据 RedisTemplate

java迷宫游戏错误仅朝一个方向进行,使用数组

android - 搜索 View 未启动可搜索 Activity 且未找到可搜索配置

jquery - 在 jQuery 中使用时,不支持的 CSS 选择器会起作用吗?

java - XML 节点转换时未声明命名空间