Попытка разобрать XML-файл в Java и сохранить переменные в ArrayList - PullRequest
0 голосов
/ 08 июля 2010

Я пытаюсь проанализировать следующий XML-файл в Java и сохранить переменную XTimeStamp в ArrayList и YVoltage в другом ArrayList:

<?xml version = "1.0"?>
<Data>
<reading>
    <XTimeStamp> 12:00:00:01</XTimeStamp>
    <YVoltage>  0.6</YVoltage>
</reading>



<reading>
    <XTimeStamp> 12:00:00:02</XTimeStamp>
    <YVoltage>  0.5</YVoltage>
</reading>



<reading>
    <XTimeStamp> 12:00:00:025</XTimeStamp>
    <YVoltage>  0.5</YVoltage>
</reading>



<reading>
    <XTimeStamp> 12:00:00:031</XTimeStamp>
    <YVoltage>  0.1</YVoltage>
</reading>



<reading>
    <XTimeStamp> 12:00:00:039</XTimeStamp>
    <YVoltage>  -0.1</YVoltage>
</reading>



<reading>
    <XTimeStamp> 12:00:00:050</XTimeStamp>
    <YVoltage>  -0.2</YVoltage>
</reading>


<reading>
    <XTimeStamp> 12:00:01:01</XTimeStamp>
    <YVoltage>  0.01</YVoltage>
</reading>
</Data>

Вот код Java, который мне в настоящее время требуется для выполнения задачи:

import java.util.*;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {

    public static void main(String argv[]) {
        ArrayList XTimeStamp = new ArrayList();
        ArrayList YVoltage = new ArrayList();

        try {
            File file = new File("C:\\Users\\user\\My Documents\\MyXMLFile.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            System.out.println("Root element "
                    + doc.getDocumentElement().getNodeName());
            NodeList nodeLst = doc.getElementsByTagName("reading");
            System.out.println("Data");

            for (int s = 0; s < nodeLst.getLength(); s++) {

                Node fstNode = nodeLst.item(s);

                if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element fstElmnt = (Element) fstNode;
                    NodeList fstNmElmntLst = fstElmnt
                            .getElementsByTagName("XTimeStamp");
                    Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
                    NodeList fstNm = fstNmElmnt.getChildNodes();
                    Element TimeStamp = (Element) fstNmElmntLst.item(0);
                    XTimeStamp.add(TimeStamp);
                    System.out.println("XTimeStamp : "
                            + ((Node) fstNm.item(0)).getNodeValue());
                    NodeList lstNmElmntLst = fstElmnt
                            .getElementsByTagName("YVoltage");
                    Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
                    NodeList lstNm = lstNmElmnt.getChildNodes();
                    Element YValue = (Element) lstNm;
                    YVoltage.add(YValue);
                    System.out.println("YVoltage : "
                            + ((Node) lstNm.item(0)).getNodeValue());
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(XTimeStamp);
        System.out.println(YVoltage);
    }
}

Когда я запускаю код, я получаю следующий вывод, как видно из списков ArrayLists внизу, возникает проблема:

Root element Data
Data
XTimeStamp :  12:00:00:01
YVoltage :   0.6
XTimeStamp :  12:00:00:02
YVoltage :   0.5
XTimeStamp :  12:00:00:025
YVoltage :   0.5
XTimeStamp :  12:00:00:031
YVoltage :   0.1
XTimeStamp :  12:00:00:039
YVoltage :   -0.1
XTimeStamp :  12:00:00:050
YVoltage :   -0.2
XTimeStamp :  12:00:01:01
YVoltage :   0.01
[[XTimeStamp: null], [XTimeStamp: null], [XTimeStamp: null], [XTimeStamp: null], [XTimeStamp: null],  [XTimeStamp: null], [XTimeStamp: null]]
[[YVoltage: null], [YVoltage: null], [YVoltage: null], [YVoltage: null], [YVoltage: null], [YVoltage: null], [YVoltage: null]]

Любойпомощь с этим будет высоко ценится.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Попробуйте это:

Вместо:

Element TimeStamp = (Element) fstNmElmntLst.item(0);
XTimeStamp.add(TimeStamp);

Do (если вы можете добавить строки в XTimeStamp):

String timeStamp = fstNm.item(0)).getNodeValue(); 
XTimeStamp.add(timeStamp);

Или сделайте это, если хотите сохранить элементы (я бы порекомендовал вам сохранить строки)

Element timeStamp = (Element) fstNm.item(0)); 
XTimeStamp.add(timeStamp);

Помните, что в Java принято называть переменные первой строчной буквой.

1 голос
/ 08 июля 2010

Мне проще использовать xpath для такого типа агрегирования данных xml:

package net.davymeers;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XpathTest {
    private static String XMLSTRING = "<data>" + "<reading>\r\n"
            + "    <XTimeStamp> 12:00:00:02</XTimeStamp>\r\n"
            + "    <YVoltage>  0.5</YVoltage>\r\n" + "</reading>\r\n" + "\r\n"
            + "\r\n" + "\r\n" + "<reading>\r\n"
            + "    <XTimeStamp> 12:00:00:025</XTimeStamp>\r\n"
            + "    <YVoltage>  0.5</YVoltage>\r\n" + "</reading>\r\n" + "\r\n"
            + "\r\n" + "\r\n" + "<reading>\r\n"
            + "    <XTimeStamp> 12:00:00:031</XTimeStamp>\r\n"
            + "    <YVoltage>  0.1</YVoltage>\r\n" + "</reading>\r\n" + "\r\n"
            + "\r\n" + "\r\n" + "<reading>\r\n"
            + "    <XTimeStamp> 12:00:00:039</XTimeStamp>\r\n"
            + "    <YVoltage>  -0.1</YVoltage>\r\n" + "</reading>\r\n" + "\r\n"
            + "\r\n" + "\r\n" + "<reading>\r\n"
            + "    <XTimeStamp> 12:00:00:050</XTimeStamp>\r\n"
            + "    <YVoltage>  -0.2</YVoltage>\r\n" + "</reading>\r\n"
            + "</data>";

    /**
     * @param args
     */
    public static void main(final String[] args) {

        final Document doc = createDocument();
        final XPath xpath = createXpath();

        final NodeList xTimeStampNodes = findElements("//XTimeStamp/text()",
                doc, xpath);
        final Collection<String> xTimeStamps = convertToCollection(xTimeStampNodes);

        final NodeList yVoltageNodes = findElements("//YVoltage/text()", doc,
                xpath);
        final Collection<String> yVoltages = convertToCollection(yVoltageNodes);

        for (final String xTimeStamp : xTimeStamps) {
            System.out.println("xTimeStamp: " + xTimeStamp);
        }
        for (final String yVoltage : yVoltages) {
            System.out.println("yVoltage: " + yVoltage);
        }
    }

    private static Document createDocument() {
        Document doc = null;
        try {
            final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            documentBuilderFactory.setNamespaceAware(true); // never forget
                                                            // this!
            final DocumentBuilder builder = documentBuilderFactory
                    .newDocumentBuilder();
            doc = builder.parse(new ByteArrayInputStream(XMLSTRING
                    .getBytes("ISO-8859-1")));
        } catch (final UnsupportedEncodingException exception) {
            // TODO handle exception
        } catch (final SAXException exception) {
            // TODO handle exception
        } catch (final IOException exception) {
            // TODO handle exception
        } catch (final ParserConfigurationException exception) {
            // TODO handle exception
        }
        return doc;
    }

    private static XPath createXpath() {
        final XPathFactory xpathFactory = XPathFactory.newInstance();
        final XPath xpath = xpathFactory.newXPath();
        return xpath;
    }

    private static NodeList findElements(final String xpathExpression,
            final Document doc, final XPath xpath) {
        NodeList nodes = null;
        if (doc != null) {
            try {
                final XPathExpression expr = xpath.compile(xpathExpression);
                final Object result = expr
                        .evaluate(doc, XPathConstants.NODESET);
                nodes = (NodeList) result;
            } catch (final XPathExpressionException exception) {
                // TODO handle exception
            }
        }
        return nodes;
    }

    private static Collection<String> convertToCollection(final NodeList nodes) {
        final Collection<String> result = new ArrayList<String>();
        if (nodes != null) {
            for (int i = 0; i < nodes.getLength(); i++) {
                result.add(nodes.item(i).getNodeValue());
            }
        }
        return result;
    }

}
1 голос
/ 08 июля 2010

Я не понимаю, почему вы вставили в свои ArrayList элементы XML (какой метод toString отображает имя тега и, насколько я помню, некоторую информацию о содержащихся атрибутах, но не внутренний текст), когда вы делаетеSystem.out.println призывает вас уделить время для преобразования вашего XML-элемента в его действительное содержимое.

Мой совет?Возьмите строку, которую вы используете для System.out.println, и поместите ее в ArrayLists.

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