如何正确创建自定义XML元素?

时间:2018-03-10 15:22:38

标签: java xml maven readxml writexml

我最近正在开发一个天气应用程序,我希望将每个客户搜索保存在.xml格式的文件中。 . . See GUI Design Here . .

我在Java上使用以下代码在.xml文件上编写所需的元素,但问题是我无法附加下一个搜索并保存新搜索,如下所示:

<search>...NEW ELEMENTS (NEW SEARCH)...</seach>

当我点击“ForeCast”按钮时。

WeatherParser.java:

public void writeOnXML(String date, String[] term, String found, String geoNameID){

    try {
        XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newFactory();
        XMLStreamWriter xMLStreamWriter;
        xMLStreamWriter = xMLOutputFactory
            .createXMLStreamWriter(new FileOutputStream
                ("src\\main\\java\\stax\\weatherSearches.xml"));
        //Create <weatherSearches></weatherSearches> (in weatherSearches.xml)
        xMLStreamWriter.writeStartElement("weathersearches");

            //Create <search></search> (weatherSearches.xml)
            xMLStreamWriter.writeStartElement("search");
            xMLStreamWriter.writeAttribute("date", date);

                //Create <search><term>...</term></search> (weatherSearches.xml)
                xMLStreamWriter.writeStartElement("term");
                    xMLStreamWriter.writeStartElement("temperature");
                    xMLStreamWriter.writeCharacters(term[0]);
                    xMLStreamWriter.writeEndElement(); //Close <Temperature>
                    xMLStreamWriter.writeStartElement("windDirection");
                    xMLStreamWriter.writeCharacters(term[1]);
                    xMLStreamWriter.writeEndElement(); //Close <WindDirection>
                    xMLStreamWriter.writeStartElement("windSpeed");
                    xMLStreamWriter.writeCharacters(term[2]);
                    xMLStreamWriter.writeEndElement(); //Close <WindSpeed>
                    xMLStreamWriter.writeStartElement("humidity");
                    xMLStreamWriter.writeCharacters(term[3]);
                    xMLStreamWriter.writeEndElement(); //Close <Humidity>
                    xMLStreamWriter.writeStartElement("pressure");
                    xMLStreamWriter.writeCharacters(term[4]);
                    xMLStreamWriter.writeEndElement(); //Close <Pressure>
                    xMLStreamWriter.writeStartElement("visibility");
                    xMLStreamWriter.writeCharacters(term[5]);
                    xMLStreamWriter.writeEndElement(); //Close <Visibility>
                xMLStreamWriter.writeEndElement(); //close <term>

                //Create <search><found></found></search> (weatherSearches.xml)
                xMLStreamWriter.writeStartElement("found");
                xMLStreamWriter.writeCharacters(found);
                xMLStreamWriter.writeEndElement(); //Close <found>

                //Create <search><geoNameID></geoNameID></search> (weatherSearches.xml)
                xMLStreamWriter.writeStartElement("geoNameID");
                xMLStreamWriter.writeCharacters(geoNameID);
                xMLStreamWriter.writeEndElement(); //Close <geoNameID>

            //Create <search></search> (weatherSearches.xml)
            xMLStreamWriter.writeEndElement(); //Close <search>

        xMLStreamWriter.writeEndElement(); //Close <weathersearches>

        //xMLStreamWriter.flush();;
        xMLStreamWriter.close();

    } 
    catch (FileNotFoundException ex) {
        loadErrorException(ex);
    } 
    catch (XMLStreamException ex) {
        loadErrorException(ex);
    }       
}

weatherSearches.xml:

<weathersearches>
<search date="Saturday - 14:00">
    <term>
        <temperature>11�C (52�F)</temperature>
        <windDirection>Southerly</windDirection>
        <windSpeed>18mph</windSpeed>
        <humidity>97%</humidity>
        <pressure>988mb</pressure>
        <visibility>Poor</visibility>
    </term>
    <found>true</found>
    <geoNameID>2656397</geoNameID>
</search>
</weathersearches>

元素<weathersearches><search><term><temperature>中的未知符号是否会导致我出现任何错误,还是应该从那里删除?

1 个答案:

答案 0 :(得分:0)

首先,你的输出看起来并不是一个有效的xml,它应该具有以下格式

  1. 标题告诉编码 UTF-8 这将处理您的特殊字符
  2. 使用DocumentBuilderFactory编写xml
  3. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <Employees xmlns="https://www.journaldev.com/employee">
    <Employee id="1">
    <name>Pankaj</name>
    <age>29</age>
    <role>Java Developer</role>
    <gender>Male</gender>
    </Employee>
    <Employee id="2">
    <name>Lisa</name>
    <age>35</age>
    <role>Manager</role>
    <gender>Female</gender>
    </Employee>
    </Employees>
    

    尝试使用此代码,这会生成一个有效的xml。

    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    
    
    public class XMLWriterDOM {
    
        public static void main(String[] args) {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder;
            try {
                dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.newDocument();
                //add elements to Document
                Element rootElement =
                    doc.createElementNS("https://www.journaldev.com/employee", "Employees");
                //append root element to document
                doc.appendChild(rootElement);
    
                //append first child element to root element
                rootElement.appendChild(getEmployee(doc, "1", "Pankaj", "29", "Java Developer", "Male"));
    
                //append second child
                rootElement.appendChild(getEmployee(doc, "2", "Lisa", "35", "Manager", "Female"));
    
                //for output to file, console
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                //for pretty print
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                DOMSource source = new DOMSource(doc);
    
                //write to console or file
                StreamResult console = new StreamResult(System.out);
                StreamResult file = new StreamResult(new File("/Users/pankaj/emps.xml"));
    
                //write data
                transformer.transform(source, console);
                transformer.transform(source, file);
                System.out.println("DONE");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        private static Node getEmployee(Document doc, String id, String name, String age, String role,
                String gender) {
            Element employee = doc.createElement("Employee");
    
            //set id attribute
            employee.setAttribute("id", id);
    
            //create name element
            employee.appendChild(getEmployeeElements(doc, employee, "name", name));
    
            //create age element
            employee.appendChild(getEmployeeElements(doc, employee, "age", age));
    
            //create role element
            employee.appendChild(getEmployeeElements(doc, employee, "role", role));
    
            //create gender element
            employee.appendChild(getEmployeeElements(doc, employee, "gender", gender));
    
            return employee;
        }
    
    
        //utility method to create text node
        private static Node getEmployeeElements(Document doc, Element element, String name, String value) {
            Element node = doc.createElement(name);
            node.appendChild(doc.createTextNode(value));
            return node;
        }
    
    }