从 JavaFX 应用程序读取 XML
Reading an XML from a JavaFX application
我想在我的 JavaFX
应用程序中通过弹出窗口 window 导入一个 XML
文件。导入后,我想阅读它。例如,我想为每个 <testbus>
存储 <index>
和 <tb_name>
中的 List
或类似的东西,其中 <index>
是 index
的 List
和 <tb_name>
是 element
的 List
。我还希望每个 <testbus>
我都可以访问 位域 及其名称。所以我在想 List
of List
。我找到了一个名为 JAXB
的 java 库,它可以解析 XML
个文件,但我不知道如何实现我想要的。
这是 XML
文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testbuses>
<testbus>
<index>00</index>
<tb_name>buffermngr00</tb_name>
<bitfield0>
<bitf_name>aaa_00</bitf_name>
</bitfield0>
<bitfield1>
<bitf_name>aaa_01</bitf_name>
</bitfield1>
<bitfield2>
<bitf_name>aaa_02</bitf_name>
</bitfield2>
<bitfield3>
<bitf_name>aaa_03</bitf_name>
</bitfield3>
<bitfield4>
<bitf_name>aaa_03</bitf_name>
</bitfield4>
<bitfield5>
<bitf_name>aaa_04</bitf_name>
</bitfield5>
<bitfield6>
<bitf_name>aaa_04</bitf_name>
</bitfield6>
<bitfield7>
<bitf_name>aaa_05</bitf_name>
</bitfield7>
</testbus>
<testbus>
<index>01</index>
<tb_name>buffermngr01</tb_name>
<bitfield0>
<bitf_name>bbb_00</bitf_name>
</bitfield0>
<bitfield1>
<bitf_name>bbb_00</bitf_name>
</bitfield1>
<bitfield2>
<bitf_name>bbb_00</bitf_name>
</bitfield2>
<bitfield3>
<bitf_name>bbb_00</bitf_name>
</bitfield3>
<bitfield4>
<bitf_name>bbb_01</bitf_name>
</bitfield4>
<bitfield5>
<bitf_name>bbb_01</bitf_name>
</bitfield5>
<bitfield6>
<bitf_name>bbb_02</bitf_name>
</bitfield6>
<bitfield7>
<bitf_name>bbb_03</bitf_name>
</bitfield7>
</testbus>
</testbuses>
无论如何,这个XML的结构并不严格,所以如果您有更好的结构建议以便于阅读,我很乐意听取您的解决方案。
为您xml提供的XML.
首先创建一个 java POJO class 字段为:
String index;
String tb_name;
List<String> bitf_names;
为此使用下面的 class:
import java.util.List;
class TestBus {
private String index;
private String tb_name;
private List<String> bitf_names;
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
public String getTb_name() {
return tb_name;
}
public void setTb_name(String tb_name) {
this.tb_name = tb_name;
}
public List<String> getBitf_names() {
return bitf_names;
}
public void setBitf_names(List<String> bitf_name) {
this.bitf_names = bitf_name;
}
@Override
public String toString() {
return "TestBus [index=" + index + ", tb_name=" + tb_name + ", bitf_name=" + bitf_names + "]";
}
}
之后,使用下面的代码创建一个 TestBus 列表 classes:
即 List<TestBus> testBusList = new ArrayList<>();
使用这个 class 来获得完整的代码和逻辑:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
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 ReadXMLFile {
public static List<TestBus> testBuses = new ArrayList<>();
public static void main(String argv[]) {
try {
File fXmlFile = new File("D:\ECLIPSE-WORKSPACE\demo-xml-project\src\main\resources\testbus.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList testBusNodeList = doc.getElementsByTagName("testbus");
for (int parameter = 0; parameter < testBusNodeList.getLength(); parameter++) {
TestBus testBus = new TestBus();
Node node = testBusNodeList.item(parameter);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
String index = eElement.getElementsByTagName("index").item(0).getTextContent();
String tb_name = eElement.getElementsByTagName("tb_name").item(0).getTextContent();
NodeList bitf_name = eElement.getElementsByTagName("bitf_name");
List<String> bitf_namesList = new ArrayList<>();
IntStream.range(0, bitf_name.getLength()).forEach(bName -> {
bitf_namesList.add(bitf_name.item(bName).getTextContent());
});
testBus.setIndex(index);
testBus.setTb_name(tb_name);
testBus.setBitf_names(bitf_namesList);
testBuses.add(testBus);
}
}
} catch (Exception e) {
System.out.println("!!!!!!!! Exception while reading xml file :" + e.getMessage());
}
testBuses.forEach(bus -> System.out.println(bus)); // in single line
System.out.println("###################################################");
// using getters
testBuses.forEach(bus -> {
System.out.println("index = " + bus.getIndex());
System.out.println("tb_name = " + bus.getTb_name());
System.out.println("bitf_names = " + bus.getBitf_names());
System.out.println("#####################################################");
});
}
}
我想在我的 JavaFX
应用程序中通过弹出窗口 window 导入一个 XML
文件。导入后,我想阅读它。例如,我想为每个 <testbus>
存储 <index>
和 <tb_name>
中的 List
或类似的东西,其中 <index>
是 index
的 List
和 <tb_name>
是 element
的 List
。我还希望每个 <testbus>
我都可以访问 位域 及其名称。所以我在想 List
of List
。我找到了一个名为 JAXB
的 java 库,它可以解析 XML
个文件,但我不知道如何实现我想要的。
这是 XML
文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testbuses>
<testbus>
<index>00</index>
<tb_name>buffermngr00</tb_name>
<bitfield0>
<bitf_name>aaa_00</bitf_name>
</bitfield0>
<bitfield1>
<bitf_name>aaa_01</bitf_name>
</bitfield1>
<bitfield2>
<bitf_name>aaa_02</bitf_name>
</bitfield2>
<bitfield3>
<bitf_name>aaa_03</bitf_name>
</bitfield3>
<bitfield4>
<bitf_name>aaa_03</bitf_name>
</bitfield4>
<bitfield5>
<bitf_name>aaa_04</bitf_name>
</bitfield5>
<bitfield6>
<bitf_name>aaa_04</bitf_name>
</bitfield6>
<bitfield7>
<bitf_name>aaa_05</bitf_name>
</bitfield7>
</testbus>
<testbus>
<index>01</index>
<tb_name>buffermngr01</tb_name>
<bitfield0>
<bitf_name>bbb_00</bitf_name>
</bitfield0>
<bitfield1>
<bitf_name>bbb_00</bitf_name>
</bitfield1>
<bitfield2>
<bitf_name>bbb_00</bitf_name>
</bitfield2>
<bitfield3>
<bitf_name>bbb_00</bitf_name>
</bitfield3>
<bitfield4>
<bitf_name>bbb_01</bitf_name>
</bitfield4>
<bitfield5>
<bitf_name>bbb_01</bitf_name>
</bitfield5>
<bitfield6>
<bitf_name>bbb_02</bitf_name>
</bitfield6>
<bitfield7>
<bitf_name>bbb_03</bitf_name>
</bitfield7>
</testbus>
</testbuses>
无论如何,这个XML的结构并不严格,所以如果您有更好的结构建议以便于阅读,我很乐意听取您的解决方案。
为您xml提供的XML.
首先创建一个 java POJO class 字段为:
String index;
String tb_name;
List<String> bitf_names;
为此使用下面的 class:
import java.util.List;
class TestBus {
private String index;
private String tb_name;
private List<String> bitf_names;
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
public String getTb_name() {
return tb_name;
}
public void setTb_name(String tb_name) {
this.tb_name = tb_name;
}
public List<String> getBitf_names() {
return bitf_names;
}
public void setBitf_names(List<String> bitf_name) {
this.bitf_names = bitf_name;
}
@Override
public String toString() {
return "TestBus [index=" + index + ", tb_name=" + tb_name + ", bitf_name=" + bitf_names + "]";
}
}
之后,使用下面的代码创建一个 TestBus 列表 classes:
即 List<TestBus> testBusList = new ArrayList<>();
使用这个 class 来获得完整的代码和逻辑:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
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 ReadXMLFile {
public static List<TestBus> testBuses = new ArrayList<>();
public static void main(String argv[]) {
try {
File fXmlFile = new File("D:\ECLIPSE-WORKSPACE\demo-xml-project\src\main\resources\testbus.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList testBusNodeList = doc.getElementsByTagName("testbus");
for (int parameter = 0; parameter < testBusNodeList.getLength(); parameter++) {
TestBus testBus = new TestBus();
Node node = testBusNodeList.item(parameter);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) node;
String index = eElement.getElementsByTagName("index").item(0).getTextContent();
String tb_name = eElement.getElementsByTagName("tb_name").item(0).getTextContent();
NodeList bitf_name = eElement.getElementsByTagName("bitf_name");
List<String> bitf_namesList = new ArrayList<>();
IntStream.range(0, bitf_name.getLength()).forEach(bName -> {
bitf_namesList.add(bitf_name.item(bName).getTextContent());
});
testBus.setIndex(index);
testBus.setTb_name(tb_name);
testBus.setBitf_names(bitf_namesList);
testBuses.add(testBus);
}
}
} catch (Exception e) {
System.out.println("!!!!!!!! Exception while reading xml file :" + e.getMessage());
}
testBuses.forEach(bus -> System.out.println(bus)); // in single line
System.out.println("###################################################");
// using getters
testBuses.forEach(bus -> {
System.out.println("index = " + bus.getIndex());
System.out.println("tb_name = " + bus.getTb_name());
System.out.println("bitf_names = " + bus.getBitf_names());
System.out.println("#####################################################");
});
}
}