Запрос парсера DOM в JAVA - PullRequest
       1

Запрос парсера DOM в JAVA

0 голосов
/ 19 декабря 2011
<subjectOf typeCode="SUBJ">
    <annotation classCode="ACT" moodCode="EVN">
        <realmCode code="QD" />
        <code code="SPECIALNOTE"></code>
        <text><![CDATA[<strong>** New York State approval pending. This test is not available for New York State patient testing **</br> ]]></text>
    </annotation>
</subjectOf>
<subjectOf typeCode="SUBJ">
    <annotation classCode="ACT" moodCode="EVN">
        <realmCode code="QD" />
        <code code="PREFERREDSPECIMEN"></code>
        <text><![CDATA[2 mL Second void urine <strong>or </strong>2-hour urine <strong>or </strong>&nbsp;2 mL Urine with no preservative]]></text>
    </annotation>
</subjectOf>

В анализе DOM, как я могу пройти через вышеупомянутый XML и получить значение тега <text> в зависимости от атрибута тега <code>, имеющего данное значение.Например, я хочу получить следующий текст:

<strong>** Ожидается утверждение штатом Нью-Йорк.Этот тест недоступен для тестирования пациентов штата Нью-Йорк **</br>

... на основе тега <code> с атрибутом code, где value="SPECIALNOTE".

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {      
    DocumentBuilderFactory domFactory =  DocumentBuilderFactory.newInstance();          
    domFactory.setNamespaceAware(true);      
    DocumentBuilder builder = domFactory.newDocumentBuilder();     
    Document doc = builder.parse("xml.xml");     
    XPath xpath = XPathFactory.newInstance().newXPath();        // XPath Query for showing all nodes value     

    XPathExpression expr = xpath.compile("/testCodeIdentifier/subjectOf/subjectOf/annotation/code[@code='SPECIALNOTE']");      
    Object result = expr.evaluate(doc, XPathConstants.NODESET);     
    NodeList nodes = (NodeList) result;     
    for (int i = 0; i < nodes.getLength(); i++) {      
        System.out.println("........"+nodes.item(i).getNodeValue()+"........");      
        }   
    } 
}

Заранее признателен за помощь ...

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Во-первых, ваше выражение XPath содержит ошибку; subjectOf повторяется без необходимости:

/subjectOf/subjectOf

Теперь, если вам действительно нужна ссылка на узел code, который предшествует целевому элементу text, тогда используйте следующее:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation/code[@code='SPECIALNOTE']");
Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(getNextElementSibling(node).getTextContent());

Где getNextElementSibling определяется следующим образом:

public static Node getNextElementSibling(Node node) {
    Node next = node;
    do {
        next = next.getNextSibling();
    } while ((next != null) && (next.getNodeType() != Node.ELEMENT_NODE));
    return next;
}

Пара замечаний по этому поводу:

  • Причина, по которой getNextSibling изначально не работал для вас, заключается (скорее всего) в том, что следующий родственный элемент указанного элемента code - это текстовый узел, а не узел элемента. (Пробелы между code и text значительны.) Вот почему нам нужно getNextElementSibling.
  • Мы выбираем один узел, поэтому вместо него используем XPathConstants.NODE, если XPathConstants.NODELIST

Обратите внимание, что вам, вероятно, следует просто сделать так, как предлагает @Lukas, и изменить свое выражение XPath для непосредственного выделения целевого текста.

Вот как получить текст напрямую (в виде строки):

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text/text()");
String text = (String) expr.evaluate(doc, XPathConstants.STRING);
System.out.println(text);

Вот как сначала получить ссылку на элемент, а затем извлечь содержимое его раздела CDATA:

XPathExpression expr = xpath.compile(
    "/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text");
Node text = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(text.getTextContent());
2 голосов
/ 19 декабря 2011

Исправьте выражение XPath так:

/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text

Вы можете, например, получить доступ к содержимому CDATA, используя

Node.getTextContent();

ОБНОВЛЕНИЕ : Вышеупомянутый XPath казался правильным на момент публикации. Тем временем вы полностью изменили свой XML-код, и теперь XPath будет читать

/testCodeIdentifier/subjectOf/code/subjectOf/annotation[code/@code='SPECIALNOTE']/text

Или, потому что я предполагаю, что этот вопрос настолько запутанный, он все еще не прав, просто сделайте:

//annotation[code/@code='SPECIALNOTE']/text
0 голосов
/ 20 декабря 2011

Наконец-то я получил ответ на свой вопрос самостоятельно ... Ниже приведен код для анализа моего XML ...

  XPath xpath = XPathFactory.newInstance().newXPath();
   // XPath Query for showing all nodes value
  XPathExpression expr = xpath.compile("//testCodeIdentifier/subjectOf/order/subjectOf/annotation/code[@code='SPECIALNOTE']/following-sibling::text/text()");

  Object result = expr.evaluate(doc, XPathConstants.NODESET);
  NodeList nodes = (NodeList) result;
  for (int i = 0; i < nodes.getLength(); i++) {

      System.out.println(nodes.item(i).getNodeValue()); 

  }

Спасибо, люди, которые ответили в этом посте.но это возможное решение для этого.Пометьте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...