анализ XML Java DOM - PullRequest
       2

анализ XML Java DOM

1 голос
/ 07 декабря 2011

У меня есть этот проект, я работаю над тем, где я хочу проанализировать XML-файл, который выглядит следующим образом:

<?xml version='1.0' encoding='UTF-8'?>
<projectlist>
  <project>
    <name>SuperDuperApp</name>
    <type>batch</type>
    <prod>
      <server>testserver01</server>
    </prod>
    <qa>
      <server>testserver01</server>
    </qa>
    <dev>
      <server>testserver01</server>
    </dev>
  </project>
  <project>
    <name>Calculator</name>
    <type>deploy</type>
    <prod>
      <server>testserver02</server>
      <server>testserver03</server>
      <server>testserver04</server>
    </prod>
    <qa>
      <server>testserver05</server>
      <server>testserver06</server>
      <server>testserver07</server>
    </qa>
    <dev>
      <server>testserver12</server>
      <server>testserver13</server>
      <server>testserver14</server>
    </dev>
  </project>
</projectlist>

С помощью этого метода выполняется синтаксический анализ файла и попытка распечатать в формате:

name: SuperDuperApp
type: batch
server: testserver01

name: Calculator
type: deploy
environment: dev
server: testserver12
server: testserver13
server: testserver14

etc.
public void parseXML() {
     ArrayList al = new ArrayList();
     HashSet hs = new HashSet();
    try {
        InputStream file = this.getClass().getResourceAsStream(
                "/net/swing/sandbox/util/config/projectlist.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(file);
        doc.getDocumentElement().normalize();

        System.out.println("Root element: " + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("project");

        System.out.println("Information of all servers...");

        for (int i=0;i<nList.getLength();i++){
            Node fstNode = nList.item(i);

            if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
                Element fstElement = (Element) fstNode;

                NodeList nameElementList = fstElement.getElementsByTagName("name");
                Element nameElement = (Element) nameElementList.item(0);
                NodeList name = nameElement.getChildNodes();
                System.out.println("project name: " + ((Node) name.item(0)).getNodeValue());
                hs.add(((Node) name.item(0)).getNodeValue());

                NodeList typeElementList = fstElement.getElementsByTagName("type");
                Element typeElement = (Element) typeElementList.item(0);
                NodeList type = typeElement.getChildNodes();
                System.out.println("Deploy type: " + ((Node) type.item(0)).getNodeValue());

                //print out server list can't do it for some reason         
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }


     try {
     al.clear();
     al.addAll(hs);
     Collections.sort(al);
     for (int z = 0; z < al.size(); z++) {
     listModel.addElement(al.get(z));
     }
     } catch (Exception e) {
     e.printStackTrace();
     }
     lstProject.validate();

}

Итак, я переписал свой метод, и теперь я просто застрял <--- newb </p>

Ответы [ 4 ]

2 голосов
/ 07 декабря 2011

Проверьте документацию для Узел .У каждого узла есть метод getChildNodes.Проверьте это на наличие дочерних узлов и затем итерируйте их, как вы делаете.

1 голос
/ 07 декабря 2011

Если ваш xml был создан с использованием схемы xsd, вы можете вместо этого использовать JAXB для создания классов для него, используя инструмент xjc. Это должно немного облегчить вашу жизнь.

0 голосов
/ 07 декабря 2011

В качестве решения вопросов и ответов вы можете применить ту же стратегию, что и для получения узла "project":

...
System.out.println("servers:");

NodeList sList = eElement.getElementsByTagName("server");
for (int i = 0; i < sList.getLength(); i++) {
    String stuff = sList.item(i).getFirstChild().getNodeValue();
    System.out.println(stuff);
}
0 голосов
/ 07 декабря 2011

Я думаю, что уместно использовать XSLT-преобразование в вашем случае (гораздо меньше стандартного кода) Посмотрите на TransformerFactory и Java API для обработки XML.

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