Хобрук: Ваш путь к мастерству в программировании

попытка получить nodeList через получение значения дочернего узла

Итак, у меня есть этот xml:

<employees>
   <employee>
     <name>John</name>
     <surname>Smith</surname>
     <age>18</age>
   </employee>
  <employee>
     <name>Test</name>
     <surname>1</surname>
     <age>18</age>
  </employee>
  <employee>
     <name>Cat</name>
     <surname>Dog</surname>
     <age>18</age>
   </employee>
   <employee>
     <name>John</name>
     <surname>Bravo</surname>
     <age>19</age>
   </employee>
</employees>

Я использую Xpath для получения дочернего узла:

File f = new File("employees.xml");
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder =  builderFactory.newDocumentBuilder();
Document doc = builder.parse(f);
XPath xPath =  XPathFactory.newInstance().newXPath();

String val = "John";

String expression = "./employees[employee/name='"+ val +"']";
Node locatedNode = (Node) xPath.evaluate(expression, doc, XPathConstants.NODE);
Nodelist result = locatedNode.getParentNode().getChildNodes();

После этого я использую цикл for, чтобы просмотреть список узлов и получить фамилии сотрудников. В этом случае я получу фамилии двух Джона и добавлю их в список массивов.

    List<Surname> sname = new ArrayList<Surname>;

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

     if (nNode.getNodeType() == Node.ELEMENT_NODE) {
         Element eElement = (Element) nNode; 
         String surname = eElement.getElementsByTagName("surname").item(0).getTextContent();
         sname.add(new Surname(surname));
     }
}

Проблема в том, что я не мог получить узел, он продолжал выдавать ошибку nullpointexception. Это мое выражение неправильное или эта строка:

Nodelist result = locatedNode.getParentNode().getChildNodes();

неправильно?

Что я хотел получить (фамилия и возраст) на основе фамилии (Джон): Смит 18 Браво 19

Фамилии обоих сотрудников Джона

13.07.2014

Ответы:


1

Эти строки выполняют работу по поиску surname узлов:

String expression = "./employees/employee[name='"+ val +"']/surname";
NodeList result = (NodeList) xPath.evaluate(expression, doc, XPathConstants.NODESET);

Затем вы можете извлечь текстовые значения, например.

for (int i = 0; i < result.getLength(); i++)
{  
  Node node = result.item(i);
  System.out.println(node.getTextContent() ); 
} // end for i

УПД. Если интересующих подузлов несколько, то оценку XPath можно выполнить в два этапа: сначала на уровне документа, затем на уровне узла:

String expression = "./employees/employee[name='"+ val +"']";
NodeList elements = (NodeList) xPath.evaluate(expression, doc, XPathConstants.NODESET);
for (int i = 0; i < elements.getLength(); i++)
{  
  Node node = elements.item(i);
  Node surname = (Node) xPath.evaluate("surname", node, XPathConstants.NODE);
  Node age = (Node) xPath.evaluate("age", node, XPathConstants.NODE);
  System.out.println(surname.getTextContent() + " " + age.getTextContent() );
} // end for i
13.07.2014
  • Спасибо, а что, если внутри сотрудника есть другие элементы, например, возраст и пол, я тоже хочу получить их значение. как мне это сделать, это получает только фамилию. 13.07.2014
  • как мне это сделать, если есть другие элементы, которые я хочу получить, как описано в отредактированном вопросе. Спасибо! 13.07.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..