Лучший способ сделать XML в Java - PullRequest
5 голосов
/ 22 апреля 2010

Есть много вопросов, которые задают лучший XML-парсер, меня больше интересует, какой XML-парсер больше всего похож на Groovy для Java?

Я хочу:

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

Самым важным является то, что я не хочу создавать класс для каждого типа узла XML, я бы предпочел просто иметь дело со всеми ними как со строками, а построение XML не ' не требуется никаких преобразователей или чего-либо, просто простой объект, который уже определен

Если вы использовали XML-парсер Groovy, вы поймете, о чем я говорю

В качестве альтернативы, лучше ли мне использовать Groovy из Java?

Ответы [ 9 ]

4 голосов
/ 23 апреля 2010

Вот что можно быстро сделать с 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));
        }
    }
3 голосов
/ 28 июля 2011

Я хотел бы бесстыдно подключить небольшую библиотеку с открытым исходным кодом, которую я написал, чтобы сделать разбор XML в Java быстрым.

Проверьте 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());
    }
});
1 голос
/ 23 апреля 2010

Используйте Groovy.

Похоже, что ваша основная цель - получить доступ к DOM "естественным" способом через средства доступа к объектам, и Java не позволит вам сделать это без определения классов. Groovy, потому что он «напечатан на утке», позволит вам сделать это.

Единственная причина не использовать Groovy в том, что (1) обработка XML является очень маленькой частью вашего приложения и / или (2) вам приходится работать с другими людьми, которые могут строго программировать на Java. *

Что бы вы ни делали, не решает "просто иметь дело со всеми ними как со строками". XML не простой формат, и если вы не знаете спецификацию внутри и снаружи, вы вряд ли поймете это правильно. Это означает, что ваш XML будет отклонен синтаксически совместимыми синтаксическими анализаторами.

1 голос
/ 23 апреля 2010

Похоже, все, что вам нужно, это простой DOM API, например, предоставляемый dom4j .На самом деле в стандартной библиотеке уже есть API-интерфейс DOM (пакеты org.w3c.dom), но это всего лишь API, поэтому вам нужна отдельная реализация - можно также использовать что-то более продвинутое, например dom4j.

0 голосов
/ 27 января 2019

Попробуйте этот код !!!!!

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
0 голосов
/ 23 апреля 2010

Я работаю с Dozer и Castor для получения OTOM (Object to Object Mapping).

0 голосов
/ 23 апреля 2010

У меня хороший опыт работы с XStream .Это довольно быстро и будет сериализовать и десериализовать Java в / из XML без схемы и с небольшим количеством кода.Построенные им иерархии объектов Java будут напрямую отражать ваш XML.

0 голосов
/ 23 апреля 2010

Раньше был очень маленький и простой анализатор XML, называемый NanoXML.Кажется, он больше не разрабатывается, но все еще доступен на http://devkix.com/nanoxml.php

0 голосов
/ 23 апреля 2010

Я настоятельно рекомендую JAXB . Отлично подходит для XML <-> инфраструктуры объектов Java.

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