Извлечение XML-текста - PullRequest
       1

Извлечение XML-текста

4 голосов
/ 03 сентября 2011

Сценарий:

Имеется следующий XML-файл:

<a:root
xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

aaaaaaaaaaaaaa

</a:root>

Как извлечь текст внутри основного элемента <a:root>:

"\naaaaaaaaaaaaaa\n"

Код, который у меня сейчас есть:

import java.io.File;
import java.util.Stack;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;


public class Proof {
    public static void main(String[] args) {
        Document doc = null;
        DocumentBuilderFactory dbf = null;
        DocumentBuilder docBuild = null;
        try {

            dbf = DocumentBuilderFactory.newInstance();
            docBuild = dbf.newDocumentBuilder();
            doc = docBuild.parse(new File("test2.xml"));

            System.out.println(doc.getFirstChild().getTextContent());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Но он возвращает текст, который я желаю ("aaaaaaaaaaaaaa") + внутренний текст для остальных элементов. Выход:

    Apples
    Bananas




  African Coffee Table
  80
  120


aaaaaaaaaaaaaa

Требуется , а не , чтобы использовать дополнительную XML-библиотеку XML!

Ответы [ 3 ]

3 голосов
/ 04 сентября 2011

Ответ @Kirill Polishchuk не является основным :

Предложено:

a:root/text()
  1. Относительное выражение и если он не оценивается, имея корневой (/) узел в качестве узла контекста, он ничего не выбирает в предоставленном документе XML.

  2. Даже XPathвыражение: /a:root/text() неверно , поскольку оно выбирает три текстовых узла - все дочерние текстовые узлы верхнего элемента - включая два текстовых узла только для пробелов.

Вот правильное решение XPath :

/a:root/text()[string-length(normalize-space()) > 0]

Когда это выражение Xpath применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):

<a:root
xmlns:a="UNDEFINED !!!!"
xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

aaaaaaaaaaaaaa

</a:root>

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

aaaaaaaaaaaaaa

Проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:a="UNDEFINED !!!!"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:text>"</xsl:text>
  <xsl:copy-of select=
   "/a:root/text()
           [string-length(normalize-space()) > 0]"/>"

 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному XML-документу (выше), требуемый, правильно выбранныйТекстовый узел lecte выводится :

"

aaaaaaaaaaaaaa

"
2 голосов
/ 03 сентября 2011

Используйте это

import java.io.File;
import java.util.Stack;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;


public class Proof {
public static void main(String[] args) {
    Document doc = null;
    DocumentBuilderFactory dbf = null;
    DocumentBuilder docBuild = null;
    try {

        dbf = DocumentBuilderFactory.newInstance();
        docBuild = dbf.newDocumentBuilder();
        doc = docBuild.parse(new File("test2.xml"));

         Element x= doc.getDocumentElement();
       NodeList m=x.getChildNodes();
       for(int i=0;i<m.getLength();i++){
           Node it=m.item(i);
           if(it.getNodeType()==3){
               System.out.println(it.getNodeValue());
           }
       }
    } catch(Exception e) {
        e.printStackTrace();
    }
}

}

2 голосов
/ 03 сентября 2011

Вы можете использовать XPath: a:root/text()

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