在Java中使用XML的更好方法

时间:2010-04-22 19:59:34

标签: java xml groovy

有很多问题需要最好的XML解析器,我更感兴趣的是什么是最像Groovy for Java的XML解析器?

我想:

SomeApiDefinedObject o = parseXml( xml );
for( SomeApiDefinedObject it : o.getChildren() ) {
   System.out.println( it.getAttributes() );
}

最重要的是我不想为每种类型的XML节点创建,我宁愿只将它们作为字符串处理,并且构建XML不会不需要任何转换器或任何东西,只需要一个已定义的简单对象

如果您使用过Groovy XML解析器,您将知道我在说什么

或者,对我来说,只使用Java中的Groovy会不会更好?

9 个答案:

答案 0 :(得分:4)

您可以使用Sun Java Streaming XML Parser

快速完成此操作
    FileInputStream xmlStream = new FileInputStream(new File("myxml.xml"));
    XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(xmlStream);
    while(reader.hasNext()){
        reader.next();
        for(int i=0; i < reader.getAttributeCount(); i++) {
           System.out.println(reader.getAttributeName(i) + "=" + reader.getAttributeValue(i));
        }
    }

答案 1 :(得分:3)

我想无耻地插入我编写的小型开源库,以便在Java中解析XML变得轻而易举。

查看Jinq2XML。

  

http://code.google.com/p/jinq2xml/

一些示例代码如下:

Jocument joc = Jocument.load(urlOrStreamOrFileName);
joc.single("root").children().each(new Action() {
    public void act(Jode j){
        System.out.println(j.name() + ": " + j.value());
    }
});

答案 2 :(得分:1)

看起来您想要的只是一个简单的DOM API,例如dom4j提供的。标准库中实际上已经有一个DOM API(org.w3c.dom包),但它只是API,所以你需要一个单独的实现 - 不妨使用像dom4j更先进的东西。

答案 3 :(得分:1)

使用Groovy。

您的主要目标似乎是能够通过对象访问器以“自然”方式访问DOM,而Java不会让您在不定义类的情况下执行此操作。 Groovy,因为它是“鸭子类型”,将允许你这样做。

不使用Groovy的唯一原因是:(1)XML处理是应用程序的一小部分,和/或(2)您必须与可能希望严格使用Java编程的其他人合作。

无论你做什么,决定“只是将它们作为字符串处理”。 XML不是一种简单的格式,除非你知道里面和外面的规范,否则你不太可能正确。这意味着您的XML将被符合规范的解析器拒绝。

答案 4 :(得分:0)

我强烈推荐JAXB。非常适合XML&lt; - &gt; Java对象框架。

答案 5 :(得分:0)

曾经有一个非常小而简单的XML解析器叫做NanoXML。它似乎不再被开发,但它仍然可以在http://devkix.com/nanoxml.php

获得

答案 6 :(得分:0)

我对XStream有很好的体验。它相当快,将序列化和反序列化Java到/从XML没有架构和很少的代码It Just Works™。它构建的Java对象层次结构将直接镜像您的XML。

答案 7 :(得分:0)

我使用Dozer和Castor获取OTOM(对象到对象映射)。

答案 8 :(得分:-1)

尝试此代码!!!!

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.*;
import javax.xml.*;

import java.io.File;
import java.io.IOException;


public class XmlDemo {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
       {
//        Get Document Builder
//      Get Document Builder
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          DocumentBuilder builder = factory.newDocumentBuilder();

          //Build Document
          Document document = builder.parse(new File("D:/test.xml"));

          //Normalize the XML Structure; It's just too important !!
          document.getDocumentElement().normalize();

          //Here comes the root node
          Element root = document.getDocumentElement();
          System.out.println(root.getNodeName());

          //Get all employees
          NodeList nList = document.getElementsByTagName("company");
          System.out.println(nList.getLength());

          System.out.println("============================");

          visitChildNodes(nList);
       }

       //This function is called recursively
       private static void visitChildNodes(NodeList nList)

       {
           Node tempNode = null;

//         System.out.println("The Number of child nodes are " + (nList.getLength()) );

           if(!(nList.getLength() == 1)) {
//             System.out.println("The Number of child nodes are " + (nList.getLength()) );

//             for (int temp = 0; temp < nList.getLength(); temp++)
//                {
//                   Node node = nList.item(temp);
//                   if (node.getNodeType() == Node.ELEMENT_NODE)
//                   {
//                     System.out.println();
//                      System.out.println("Node Name = " + node.getNodeName() + ";");
//                   }
//                }   
           }

          for (int temp = 0; temp < nList.getLength(); temp++)
          {
             Node node = nList.item(temp);
             if (node.getNodeType() == Node.ELEMENT_NODE)
             {
               System.out.println();
                System.out.println("Node Name = " + node.getNodeName() + ";");

//              if (node.hasAttributes()) {
//                     // get attributes names and values
//                     NamedNodeMap nodeMap = node.getAttributes();
//                     for (int i = 0; i < nodeMap.getLength(); i++)
//                     {
//                         tempNode = nodeMap.item(i);
//                         System.out.println("                     Attr  : " + tempNode.getNodeName()+ "; Value = " + tempNode.getNodeValue());
//                     }
//                     
//                 }else {
////                       System.out.println("No Attributes");
//                 }

                if (node.hasChildNodes()) {
                       NodeList nodeList = node.getChildNodes();

                       if((node.getChildNodes().getLength()/2)>0) {
                           System.out.println("This node has child nodes "+ (node.getChildNodes().getLength()/2));
                       System.out.println("Child nodes of : [ " + node.getNodeName() + " ] =>");
                       for(int k = 0;k < nodeList.getLength(); k++) {

                           Node n = nodeList.item(k);
                           if (n.getNodeType() == Node.ELEMENT_NODE)
                         {


                               if((k<(nodeList.getLength()))) {
                                   System.out.println("                           [ " + n.getNodeName() + " ] =>" );
                                   if (n.hasAttributes()) {
//                                     // get attributes names and values
                                       NamedNodeMap nodeMap = n.getAttributes();
                                       for (int i = 0; i < nodeMap.getLength(); i++)
                                       {
                                           tempNode = nodeMap.item(i);
                                           System.out.println("                                  Attr  : " + tempNode.getNodeName()+ "; Value = " + tempNode.getNodeValue() + " ]");
                                       }

                                   }else {
//                                     System.out.println("No Attributes");
                                   }



                               }else if((k==(nodeList.getLength()))) {
                                   System.out.println("                     [ " + n.getNodeName() + " ]");

                               }


                       }
                       }

                       System.out.println("                  ]");
                       }
                      visitChildNodes(node.getChildNodes());


                   }

        }
          }
       }

}

    enter code here