gpt4 book ai didi

java - 在 java 中读取和写入 xml

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:33 24 4
gpt4 key购买 nike

我正在使用 Stax 解析器读取 XML 文件并使用 Java 中的 DOM 编写它。我没有得到所需的 XML 输出。我阅读了以下 XML 文件

<config>

<Sensor1>
<name>abc</name>
<range>100</range>
</Sensor1>

<sensor2>
<name>xyz</name>
<range>100</range>
</sensor2>

</config>

我使用 Stax 解析器解析上述 XML 文件如下

public void readConfig(String configFile) {
boolean sensor1 = false;
boolean sensor2 = false;

try
{
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
InputStream in = new FileInputStream(configFile);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);

// Read the XML document
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();

if (event.isStartElement()) {

StartElement startElement = event.asStartElement();

if (startElement.getName().getLocalPart() == (sensor1)) {

sensor1 = true;
Sensor1 Obj1 = new Sensor1();
}

if (startElement.getName().getLocalPart() == (sensor2)) {

sensor2 = true;
Sensor2 Obj2 = new Sensor2();

}



if (sensor1) {

if (event.asStartElement().getName().getLocalPart().equals(name)) {

event = eventReader.nextEvent();
Obj1.set_Sensor_Name(event.asCharacters().getData());
continue;
}


if (event.asStartElement().getName().getLocalPart().equals(range)) {

event = eventReader.nextEvent();
Obj1.set_Sensor_Range(event.asCharacters().getData());
continue;
}
}


if (sensor2) {

if (event.asStartElement().getName().getLocalPart().equals(name)) {
event = eventReader.nextEvent();
Obj2.set_Sensor_Name(event.asCharacters().getData());
continue;
}

if (event.asStartElement().getName().getLocalPart().equals(range)) {

event = eventReader.nextEvent();
Obj1.set_Sensor_Range(event.asCharacters().getData());
continue;
}


}

if (event.isEndElement()) {
EndElement endElement = event.asEndElement();
if (endElement.getName().getLocalPart() == (sensor1)) {

sensor1.addToArray();
}

if (endElement.getName().getLocalPart() == (sensor2)) {

sensor2.addToArray();

}
}
}

在“Sensor1”和“Sensor2”类中,我根据某些条件添加了额外的信息。

class Sensor1 {

public ArrayList<Object> list = new ArrayList<Object>();
String name;
double range;

public void set_Sensor_Name(String name) {
this.name = name;

}

public void set_Sensor_Range(double range) {
this.range = range;

}

public void addToArray(){
double distance =50;

if(distance<range){
list.add("TITANIC");
list.add(123456);
}

WriteFile fileObj = new WriteFile();
fileObj.writeXMlFile(list);

}

}

这是编写 XML 的类

public class WriteFile {

public void writeXmlFile(ArrayList<Object> list) {

try {

DocumentBuilderFactory dFact = DocumentBuilderFactory.newInstance();
DocumentBuilder build = dFact.newDocumentBuilder();
Document doc = build.newDocument();

Element root = doc.createElement("SensorTracks");
doc.appendChild(root);

Element sensorInfo = doc.createElement("SensorDetails");
root.appendChild(sensorInfo);

Element vesselInfo = doc.createElement("VesselDetails");
root.appendChild(vesselInfo);


for(int i=0; i<list.size(); i +=4 ) {

Element name = doc.createElement("SensorName");
name.appendChild(doc.createTextNode(String.valueOf(list.get(i))));
sensorInfo.appendChild(name);

Element range = doc.createElement("SensorRange");
name.appendChild(doc.createTextNode(String.valueOf(list.get(i+1))));
sensorInfo.appendChild(range);

Element mmi = doc.createElement("shipname");
mmi.appendChild(doc.createTextNode(String.valueOf(list.get(i+2))));
vesselInfo.appendChild(mmi);

Element license = doc.createElement("license");
license.appendChild(doc.createTextNode(String.valueOf(list.get(i+3))));
vesselInfo.appendChild(license);

}


// Save the document to the disk file
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();

// format the XML nicely
aTransformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");

aTransformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");
aTransformer.setOutputProperty(OutputKeys.INDENT, "yes");



DOMSource source = new DOMSource(doc);
try {
FileWriter fos = new FileWriter("/home/ros.xml");
StreamResult result = new StreamResult(fos);
aTransformer.transform(source, result);

} catch (IOException e) {

e.printStackTrace();
}



} catch (TransformerException ex) {
System.out.println("Error outputting document");

} catch (ParserConfigurationException ex) {
System.out.println("Error building document");
}

当我执行时,我得到以下 XML

<SensorTracks>        
<sensorDetails>
<SensorName>xyz</SensorName>
<SensorRange>100</SensorRange>
</sensorDetails>
<VesselDetails>
<shipname>TITANIC</shipname>
<license>123456</license>
</vesselDetails>

我的最终输出必须是

<config>

<SensorTracks>
<sensorDetails>
<SensorName>xyz</SensorName>
<SensorRange>100</SensorRange>
<SensorName>abc</SensorName>
<SensorRange>100</SensorRange>
</sensorDetails>
<VesselDetails>
<shipname>TITANIC</shipname>
<license>123456</license>
</vesselDetails>

我在我的代码中做错了什么??任何帮助表示赞赏。提前致谢

最佳答案

我又来回答我自己的问题了。问题很简单。如上所述获得所需的输出。只需对“WriteFile”类进行以下更改即可。

FileWriter fos = new FileWriter("/home/ros.xml" ,true);

我终于开始学习 Java 了:)

关于java - 在 java 中读取和写入 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10299124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com