Чтение всех CDATA в XML-строке в Java ArrayList? - PullRequest
0 голосов
/ 14 октября 2011

Я хотел бы прочитать все CDATA, связанные с дочерним узлом, и сохранить их в Java ArrayList!Если бы вы могли предложить простой и быстрый способ, я был бы очень признателен!

Спасибо!

In хотел бы провести небольшую рутинную проверку txnid для конкретного значения и прочитать все связанныеЗапросы CDATA в различных элементах массива.

 <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
 <ZQueries txid="Group 1" version="1.0.0.0">
 <ZQuery name="Some Name 1" savename="SomeFileName1.xml">
  <![CDATA[ 
      SELECT ...........

  ]]> 
 </ZQuery>
 <ZQuery name="Some Name 2"   savename="SomeFileName.xml">
 <![CDATA[ 
    SELECT .............


  ]]> 
</ZQuery>
<ZQuery name="some name 3" savename="someFileName.xml">
<![CDATA[ 
    SELECT ..............

 ]]> 
 </ZQuery>
 </ZQueries>
 <ZQueries txid="Group 2" version="1.0.0.0">
 <ZQuery name="Some Name 1" savename="SomeFileName1.xml">
  <![CDATA[ 
      SELECT ...........

  ]]> 
 </ZQuery>
 <ZQuery name="Some Name 2"   savename="SomeFileName.xml">
 <![CDATA[ 
    SELECT .............


  ]]> 

 </ZQueries>

ЭТО ПРАВИЛЬНЫЙ ПОДХОД!СЛЕДУЮЩИЙ КОД СОЗДАЕТ ИСКЛЮЧЕНИЕ ПОКАЗАНО!КАК ВЫ ДУМАЕТЕ, ЧТО Я МОГУ ПОЛУЧИТЬ ЭТО!

 SAXBuilder builder = new SAXBuilder();
 Document doc = builder.build(in);  //build a JDOM doc from an input stream
 ArrayList<String> queries = new ArrayList<String>();
 Element root = doc.getRootElement();

 Iterator elemIter = root.getDescendants();

 while (elemIter.hasNext()) {
     Element tempElem = (Element) elemIter.next();
     if (root.getChild("ZQueries").getAttributeValue("txnid").equals(tempTxnid)) {
         String CDATA = tempElem.getChildText("ZQueries");
         queries.add(CDATA);
     } 
 }



Exception in thread "AWT-EventQueue-0" java.security.PrivilegedActionException:
java.security.PrivilegedActionException: org.jdom.input.JDOMParseException: Error on 
line 1: Premature end of file.

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

Изучите использование JDOM . Прежде чем анализировать документ, создайте список Array, вероятно, типа string. Перебирайте элементы и, когда вы нажимаете элемент ZQuery, используйте element.getChildText ("ZQuery"), который вернет всю информацию CDATA без тегов CDATA.

FileInputStream fis = new FileInputStream(file); //where file holds the data to parse. 

Can also use StringBuilder
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(fis); //build a JDOM doc from file
ArrayList<String> arl = new ArrayList<String>();
Element root = doc.getRootElement();
Iterator elemIter = root.getDescendants(); //you can put filters on this to only get specific types of elements ie: root.getDescendants("ZQuery"); will give you an iterator over just ZQuery elements. 

while (elemIter.hasNext()) {
    Element foo = (Element) elemIter.next();
    String CDATA = foo.getChildText("ZQuery")
    arl.add(CDATA);
}

Дополнительные ресурсы:

0 голосов
/ 14 октября 2011

Используйте SAX Parser:

try {
    // Create a builder factory
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    // Configure it to coalesce CDATA nodes
    factory.setCoalescing(true);

    // Create the builder and parse the file
    // Perform your Parsing here 

    // doc will not contain any CDATA nodes
} catch (SAXException e) {
    // A parsing error occurred; the xml input is not valid
} catch (ParserConfigurationException e) {
} catch (IOException e) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...