0

読み取ってオブジェクトに変換しようとしている XML ファイルがあります。映画ID、日付、金額で定義されたLocationオブジェクトで満たされた配列にすべての場所を変換して入れたいと思います。

ここに私のXMLファイルがあります:

場所の XML セクションをスキャンするコードは次のとおりです。

 public void findLocations() throws ParseException {

    NodeList nList = document.getElementsByTagName("location");
    Location[] locations = new Location[nList.getLength()];
    for (int temp = 0; temp < nList.getLength(); temp++) {
        Node nNode = nList.item(temp);

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
           Element eElement = (Element) nNode;
              locations[temp] = new Location(getTagValue("filmid", eElement), dateChanger(getTagValue("date", eElement)), getTagValue("amount", eElement));
         System.out.println(locations[temp].getAmount()); //Outputs the good values.
        }

    }
 System.out.println(locations[0].getAmount()); //Output : 5$
 System.out.println(locations[1].getAmount()); //Output : 5$
 System.out.println(locations[2].getAmount()); //Output : 5$
}


private static String getTagValue(String sTag, Element eElement) {

    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    return nValue.getNodeValue();
}

問題は、私の配列が同じ場所で 3 回いっぱいになり、最後の場所で 3 回いっぱいになるようです。それ以外のオブジェクトはよく形成されているので、その部分は正しいと思います。

4

2 に答える 2

1

代わりにXPathを使用できます...

public class TestXML03 {

    public static void main(String[] args) {

        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(false);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document xmlDoc = builder.parse(new File("Test.xml"));

            Node root = xmlDoc.getDocumentElement();

            XPathFactory xFactory = XPathFactory.newInstance();
            XPath xPath = xFactory.newXPath();

            XPathExpression xExpress = xPath.compile("/file/location");
            NodeList nodes = (NodeList) xExpress.evaluate(root, XPathConstants.NODESET);

            System.out.println("Found " + nodes.getLength() + " location nodes");
            System.out.println("");

            for (int index = 0; index < nodes.getLength(); index++) {
                Node node = nodes.item(index);
                xExpress = xPath.compile("filmid");
                Node filmIDNode = (Node) xExpress.evaluate(node, XPathConstants.NODE);
                System.out.println(filmIDNode.getNodeName() + " = " + filmIDNode.getTextContent());

                xExpress = xPath.compile("date");
                Node dateNode = (Node) xExpress.evaluate(node, XPathConstants.NODE);
                System.out.println(dateNode.getNodeName() + " = " + dateNode.getTextContent());

                xExpress = xPath.compile("amount");
                Node amountNode = (Node) xExpress.evaluate(node, XPathConstants.NODE);
                System.out.println(amountNode.getNodeName() + " = " + amountNode.getTextContent());

                System.out.println("");
            }

        } catch (Exception exp) {
            exp.printStackTrace();
        }
    }
}

どの出力...

Found 3 location nodes

filmid = 100
date = 2013-01-11
amount = 4.00$

filmid = 200
date = 2013-01-13
amount = 9.00$

filmid = 334
date = 2013-01-23
amount = 5.00$

フィードバック後に更新

クラスはそのクラス フィールドへLocationの参照を維持してstaticいます。これは、フィールドの値を変更すると、そのクラスのすべてのインスタンスの値が変更されることを意味します。

参照を削除するstaticと、問題が解決するはずです。

于 2013-01-23T01:23:36.603 に答える
0

ソースは完全に機能しています。以下のようにソースを出力タグに変更するだけです。

public static void findLocations(Document document) throws ParseException {
    NodeList nList = document.getElementsByTagName("location");
    Location[] locations = new Location[nList.getLength()];
    for (int temp = 0; temp < nList.getLength(); temp++) {
        Node nNode = nList.item(temp);

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            System.out.println(getTagValue("filmid", eElement));
            System.out.println(getTagValue("date", eElement));
            System.out.println(getTagValue("amount", eElement));
            System.out.println();
        }
    }
}

適切な出力が得られました

100
2013-01-11
4.00$

200
2013-01-13
9.00$

334
2013-01-23
5.00$

XML 入力が適切かどうかを確認してください。

于 2013-01-23T00:50:12.630 に答える