【问题标题】:Reading all CDATA in an XML String into a Java ArrayList?将 XML 字符串中的所有 CDATA 读入 Java ArrayList?
【发布时间】:2011-10-14 17:33:00
【问题描述】:

我想读取与子节点关联的所有 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.

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    使用 SAX 解析器:

    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) {
    }
    

    【讨论】:

    • - - - 跨度>
    • 对不起,我已在实际问题区域中提供了此查询,并对其添加了更多描述以显示我的确切意思。现在使用您的方法,我应该如何将一些查询的 CDATA 存储到数组中??!
    【解决方案2】:

    考虑使用JDOM。在解析文档之前,创建一个数组列表,可能是字符串类型。遍历元素,当您点击 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);
    }
    

    其他资源:

    【讨论】:

    • 如果你能给我一个小演示,我将非常感激!我对 XML 的了解非常有限!
    • @Sam 完成。如果您想了解有关 XML 的更多信息,我建议您访问w3schools.com 网站并查找他们关于 XML 的教程。它会让您深入了解它的工作原理。
    • 感谢一百万!现在您将如何更改此代码,以便在达到某个值的“txid”时,读取其关联 CDATA 的内容并将其存储在数组中??!再次感谢大家的热心帮助!
    • 不客气。如果您尝试自己编写,您将学到更多,而不是我为您编写。我添加了一些指向其他资源的链接,以了解 JDOM 解析。您解析更多元素、获取属性等。阅读 JDOM javadoc 和那些教程将使您走上您想去的道路。当您解析包含它的元素时,您需要添加的只是 txid 属性上的一个标志。乱搞设置 JDOM 解析器!你会学到很多东西!
    • 没有任何人可以为此提供的“食谱”。这不是对正确成员函数的一次调用。手头的任务是基本的 XML 处理的基本应用程序。你需要花时间学习如何使用 StaX 或 DOM 或 JDOM 或任何吸引人的东西,然后这会很容易。
    猜你喜欢
    • 2012-12-18
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2014-01-03
    • 1970-01-01
    • 2011-04-24
    • 2013-09-26
    相关资源
    最近更新 更多