XML Java читает Node?

1

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

У меня есть простой XML файл:

<?xml version="1.0" encoding="UTF-8"?>
<ItemList>
        <Item id="1">
            <Clothes>
                <element1>Test Cloth</element1>
                <element2>1</element2>
                <element3>true</element3>
                <element4>1</element4>
                <element5>100</element5>
                <element6>4</element6>
                <element7>false</element7>
            </Clothes>
        </Item>
</ItemList>

Ява:

InputStream is = ItemsLoader.class.getResourceAsStream("ItemList.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);

doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName("Item");

for (int i = 0; i < nList.getLength(); i++) {
    Node nNode = nList.item(i);

    Element eItemElement = (Element)nNode;
    Node elementNode = eItemElement.getFirstChild();

    System.out.println("Item Node name: " + nNode.getNodeName());
    System.out.println("Element Node name: " + elementNode.getNodeName());

}

Мой выход:

Пункт

текст#

Почему я не могу получить дочерний узел? Детский узел предмета должен быть "Одежда".

Спасибо за поддержку!

Теги:
nodes

2 ответа

2

Этот <item> имеет один дочерний узел:

<Item id="1"><Clothes>...</Clothes></Item>

У этого другого три. Два из них невидимы:

<Item id="1">
     <Clothes>...</Clothes> 
</Item>

Здесь показаны невидимые узлы (я заменил их на [#...#]):

<Item id="1">[#
#####]<Clothes>...</Clothes>[#]
</Item>

Это текстовые узлы (Текст), и они содержат все пробельные символы до следующего узла другого типа. Когда вы используете метод, например getFirstChild() который возвращает Node, вы получите первый Node независимо от его типа. Вы не всегда можете предположить, что это будет элемент, если вы не разделили все пробелы между элементами при анализе исходного документа. Он все еще может быть не документом. Узлы комментариев и узлы обработки также считаются дочерними.

Безопасный способ доступа к вашим дочерним элементам элементов - проверить, является ли узел фактически элементом. Вы можете сделать это, сравнивая тип узла, который вы можете получить с помощью метода getNodeType(), и константы в интерфейсе Node которые представляют типы узлов и пропускают узлы, которые не являются элементами.

if(node.getNodeType() == Node.ELEMENT_NODE) { 
    // this is an element!
    Element myElement = (Node)node;
}

Вы также можете использовать другие API, такие как DOM4J или JDOM, которые включают дополнительные методы, возвращающие дочерние элементы, стандартный API XPath, в котором вы можете получить NodeList элементов в качестве результата или стандартные методы DOM, такие как getElementsByTagName, которые вы можете вызывать из вашего контекстного элемента ссылку и получить все элементы-потомки из вашего поддерева.

В вашей программе вы можете получить узел "Элемент Clothes ", извлекая итерацию в списке узлов getChildNodes() и получая первый узел, у которого есть тип узла, соответствующий Node.ELEMENT_NODE.

  • 0
    Спасибо! это очень просто!
1

Это потому, что ваш входной XML с отступом и, как таковой, имеет пробельные символы. Первый дочерний Item на самом деле является текстовым узлом, содержащим все пробелы/табуляции/новые строки, которые существуют между > Item и < of Clothes.

Если вы хотите этого избежать, вам придется либо сконденсировать ваш XML файл, чтобы он не содержал пробелы между тегами, либо чтобы установить JSXP-парсер в "режим проверки" и установить его, чтобы избежать невежественных пробелов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню