Как проверить, нет ли в узле ни одного брата? - PullRequest
3 голосов
/ 09 ноября 2009

У меня есть объект org.w3c.dom.Node.

Я хотел бы посмотреть, есть ли у него другие братья и сестры.

Вот что я пробовал:

Node sibling = node.getNextSibling();
if(sibling == null)
    return true;
else
    return false;

ОДНАКО, по какой-то причине (возможно, из-за отступов или пробелов в исходном XML) я не получаю ожидаемого результата.

[Также

 node.getParentNode().getChildNodes().getLength() 

дает значение выше, чем я ожидал.]

Я приветствую ваши предложения по улучшению этого кода.

EDIT

Как показано ниже, кажется, что пустые узлы мешают моим попыткам сосчитать братьев и сестер.

XML выглядит примерно так:

  <a>
        <b>
              <c>I have this node:</c>
              <c>I want to know how many of these there are.</c>
              <c>This is another sibling.</c>
        </b>
        <b>
        </b>

  </a>

Начиная с моего узла (первый выше), как мне узнать количество других братьев и сестер?

Ответы [ 4 ]

3 голосов
/ 09 ноября 2009

Когда вы получаете дочерние узлы от другого узла, вы получаете все прямые дочерние узлы. Это будет включать в себя узлы элементов, текстовые узлы и узлы комментариев. Чаще всего вы будете заботиться только об элементах. Таким образом, вы можете проверить результат getChildNodes, чтобы увидеть, есть ли ELEMENT_NODE.

Пример функции для того, что вы хотели сделать:

public function isSingleChild(Node node) {
    boolean singleChild = true;
    NodeList siblings = node.getParentNode().getChildNodes();
    for(int i = 0, int len = siblings.getLength(); i < len; i++) {
        if(siblings.item(i).getNodeType() == Node.ELEMENT_NODE) {
            singleChild = false;
            break;
        }
    }

    return singleChild;
}

Просто чтобы посмотреть, на что похож каждый тип узла:

<div>
    <!-- Comment Node -->
    <p>Element node</p>
    a text node
</div>

Получение дочерних узлов div вернуло бы 3 узла, узел комментария, содержащий «Узел комментария», узел «Элемент» «P» и узел «Текст» «текстовый узел».

2 голосов
/ 09 ноября 2009

вы можете посчитать количество дочерних узлов в родительском элементе после фильтрации пустых узлов. (что вы, вероятно, не хотите, но также, вероятно, портите ожидаемый результат).

Я не могу выразить это в реальном Java очень быстро, потому что я недостаточно знаком с этим, но это должно быть довольно просто.

1 голос
/ 09 ноября 2009

Я не Java-парень, но в C # один из способов проверить элемент на наличие братьев и сестер - использовать запрос XPath:

bool hasSiblings = elm.SelectNodes("../*").Count == 1;

Селектор * находит только элементы, что избавляет вас от необходимости помнить, что «узел» может означать элемент, текстовый узел, инструкцию обработки или комментарий. (Я бы оценил, что в 90% случаев, когда кто-то, говорящий о XML, использует слово «узел», они действительно означают «элемент».)

0 голосов
/ 10 ноября 2009

Спасибо всем за ваш вклад.

Вот код, который я использовал в конце, он основан на коде seanmonstar.

public Boolean isSingleChild(Node node)
{
    int elementNodes = 0;
    NodeList siblings = node.getParentNode().getChildNodes();
    for(int x = 0 ; x < siblings.getLength(); x++)
    {
        if(siblings.item(x).getNodeType() == Node.ELEMENT_NODE)
        {
            elementNodes++;
        }
    }
    if(elementNodes == 1)
         return true;
    else
        return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...