4

我有一个 XML 文档:

<entities xmlns="urn:yahoo:cap">
    <entity score="0.988">
        <text end="4" endchar="4" start="0" startchar="0">Messi</text>
        <wiki_url>http://en.wikipedia.com/wiki/Lionel_Messi</wiki_url>
        <types>
            <type region="us">/person</type>
        </types>
    </entity>
</entities>

我有一个TreeMap<String,String> data存储getTextContent()和元素"text"的。"wiki_url"有些"entity"s 只有"text"元素 (no "wiki_url"),所以我需要一种方法来找出什么时候只有 text 元素作为子元素,什么时候有"wiki_url". 我可以使用document.getElementByTag("text")&document.getElementByTag("wiki_url")但我会失去文本和 url 之间的关系。

我正在尝试使用以下方法获取元素中的"entity"元素数量:

NodeList entities = document.getElementsByTagName("entity"); //List of all the entity nodes
int nchild; //Number of children
System.out.println("Number of entities: "+ entities.getLength()); //Prints 1 as expected
nchild=entities.item(0).getChildNodes().getLength(); //Returns 7

但是,如上所示,这会返回 7(我不明白,如果包括孙子,肯定是 3 或 4)然后我将使用孩子的数量来循环遍历它们,以检查是否getNodeName().equals("wiki_url")并将其保存到数据中正确的。

为什么我只能数 3 个孩子和 1 个孙子,而孩子的数量却是 7 个?

4

1 回答 1

3

后面>的空格<entity score="0.988">也算节点,类似地,标签之间的行尾字符也被解析为节点。如果您对具有名称的特定节点感兴趣,请添加如下所示的辅助方法并在您想要的任何地方调用。

Node getChild(final NodeList list, final String name)
    {
        for (int i = 0; i < list.getLength(); i++)
        {
            final Node node = list.item(i);
            if (name.equals(node.getNodeName()))
            {
                return node;
            }
        }
        return null;
    }

并打电话

final NodeList childNodes = entities.item(0).getChildNodes();
final Node textNode = getChild(childNodes, "text");
final Node wikiUrlNode = getChild(childNodes, "wiki_url");

通常在使用 DOM 时,会想出像上面这样的辅助方法来简化主要的处理逻辑。

于 2013-06-24T15:56:51.990 回答