1

データを XML に保存するメソッドを使用して Java アプリケーションを作成しています。

これが私のコードです:

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.newDocument();
    Element rootElement = doc.createElement("Weather");
    doc.appendChild(rootElement);

    Element weatherElement = doc.createElement(strCity);
    rootElement.appendChild(weatherElement);

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

   } catch (ParserConfigurationException pce) {
    pce.printStackTrace();
  } catch (TransformerException tfe) {
    tfe.printStackTrace();
  }    
}        

メソッド呼び出し:

SaveToXML("Auckland", "24-05-2013", "Fine", "10", "Test.xml");

出力 XML データは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Weather>
    <Auckland>
        <Date id="24-05-2013">
            <forecast>Fine</forecast>
            <mindegrees>10</mindegrees>
        </Date>
    </Auckland>
</Weather>

メソッドが呼び出されたときにデータがドキュメントの正しい要素に追加されるように、コードを修正する方法を教えてください。

たとえば、メソッドがオークランド市で 2 回呼び出されると、天気の詳細がオークランド要素に配置されます。ドキュメントにまだない都市がパラメータとして渡された場合、その都市の新しい要素が作成されます。

更新2

これは、エラーを実行する私の現在のコードです:

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    //Document doc = docBuilder.newDocument();
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(FileName));
    Element rootElement = doc.createElement("Weather");
    doc.appendChild(rootElement);

    NodeList weatherNodes = rootElement.getElementsByTagName(strCity);// do we already have node?
    Element weatherElement;
      if(weatherNodes.getLength() > 0){                     // if so reuse
        weatherElement = (Element) weatherNodes.item(0);
        System.out.println("Found");
    }else {                                               // else create
        weatherElement = doc.createElement(strCity);
        rootElement.appendChild(weatherElement);    
    }

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

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

上記のコードは、実行時に次のエラーを生成します。

[致命的なエラー] Test.xml:1:177: ルート要素に続くドキュメントのマークアップは整形式でなければなりません。org.xml.sax.SAXParseException: ルート要素に続くドキュメント内のマークアップは整形式でなければなりません。

更新3

動作しているコードは次のとおりです。

private void SaveToXML(String strCity, String strDate, String strforecast, String strminDegrees, String FileName)
{
    try 
    {

    DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc;
    File file = new File(FileName);
    if (!file.exists()) {
        doc = docBuilder.newDocument();
        doc.appendChild(doc.createElement("Weather"));
    } else {
        doc = docBuilder.parse(new File(FileName));
    }

    Element rootElement = doc.getDocumentElement();
    Element weatherElement;
    NodeList weatherNodes = doc.getDocumentElement().getElementsByTagName(strCity);
    if (weatherNodes.getLength() > 0) {
        weatherElement = (Element) weatherNodes.item(0);
    } else {
        weatherElement = doc.createElement(strCity);
        rootElement.appendChild(weatherElement); 
    }

    Element dateElement = doc.createElement("Date");
    weatherElement.appendChild(dateElement);

    Attr attr = doc.createAttribute("id");
    attr.setValue(strDate);
    dateElement.setAttributeNode(attr);

    Element forecast = doc.createElement("forecast");
    forecast.appendChild(doc.createTextNode(strforecast));
    dateElement.appendChild(forecast);

    Element mindegrees = doc.createElement("mindegrees");
    mindegrees.appendChild(doc.createTextNode(strminDegrees));
    dateElement.appendChild(mindegrees);

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(doc);
    StreamResult result = new StreamResult(new File(FileName));

    transformer.transform(source, result);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}       
4

2 に答える 2

0

DOM のドキュメント構造を更新する方法を変更するには、

変更

Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Weather");
doc.appendChild(rootElement);

Element weatherElement = doc.createElement(strCity);
rootElement.appendChild(weatherElement);

Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("Weather");
doc.appendChild(rootElement);

  NodeList weatherNodes = rootElement.getElementsByTagName(strCity);// do we already have node?
  Element weatherElement;
  if(weatherNodes.getLength() > 0){                     // if so reuse
    weatherElement = (Element) weatherNodes.item(0);
}else {                                               // else create
    weatherElement = doc.createElement(strCity);
    rootElement.appendChild(weatherElement);    
}

DOM は実際には小さなドキュメントを対象としていることに注意してください。これが非常に大きくなる場合は、STaX などを検討する必要があります。

于 2013-05-24T01:34:31.253 に答える