java - 在 Java 中解析 DOM 时需要创建类吗?
问题描述
我有一个如下所示的 XML 文档:
<?xml version="1.0"?>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
<Street>123 Maple Street</Street>
<City>Mill Valley</City>
<State>CA</State>
<Zip>10999</Zip>
<Country>USA</Country>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
<Street>8 Oak Avenue</Street>
<City>Old Town</City>
<State>PA</State>
<Zip>95819</Zip>
<Country>USA</Country>
</Address>
<DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
<Items>
<Item PartNumber="872-AA">
<ProductName>Lawnmower</ProductName>
<Quantity>1</Quantity>
<USPrice>148.95</USPrice>
<Comment>Confirm this is electric</Comment>
</Item>
<Item PartNumber="926-AA">
<ProductName>Baby Monitor</ProductName>
<Quantity>2</Quantity>
<USPrice>39.98</USPrice>
<ShipDate>1999-05-21</ShipDate>
</Item>
</Items>
</PurchaseOrder>
在来自 Internet 的示例中,为了显示文档中的信息,创建了一个类来描述该文档中的实体(地址、项目)。这被认为是一种好的做法,还是我们可以在没有其他类的帮助的情况下从文档中输出信息?如果为每个实体创建一个单独的类,那么如何解决文档中子标签不同的问题?例如:这个文档有一个 Item 标签,在第一种情况下它有一个 Comment 子标签,在第二种情况下它有一个 ShipDate 标签。创建类时,我同时创建了评论字段和shipDate 字段。但是在填写字段时,我得到一个错误,getContentText() 方法返回 null(这很明显,因为在第一种情况下,Item 标签没有 ShipDate 子标签)。这种情况下该怎么办?
这是我的代码,但我知道这样的解决方案不是一个好的解决方案:
public class DOMReader {
public static void main(String[] args) {
String filePath = "OrderList.xml";
File xmlFile = new File(filePath);
try {
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = docBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
System.out.println("Корневой элемент: " + doc.getDocumentElement().getNodeName());
NodeList addressNodeList = doc.getElementsByTagName("Address");
NodeList itemsNodeList = doc.getElementsByTagName("Item");
List<Address> addressesList = new ArrayList<>();
List<Items> itemsList = new ArrayList<>();
for (int i = 0; i < addressNodeList.getLength(); i++) {
addressesList.add(getAddress(addressNodeList.item(i)));
}
for (int i = 0; i < itemsNodeList.getLength(); i++) {
itemsList.add(getItem(itemsNodeList.item(i)));
}
for (Address address : addressesList) {
System.out.println(address.toString());
}
for (Items items : itemsList) {
System.out.println(items.toString());
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static Address getAddress(Node node) {
Address address = new Address();
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
address.setType(element.getAttribute("Type"));
address.setName(element.getElementsByTagName("Name").item(0).getTextContent());
address.setStreet(element.getElementsByTagName("Street").item(0).getTextContent());
address.setCity(element.getElementsByTagName("City").item(0).getTextContent());
address.setState(element.getElementsByTagName("State").item(0).getTextContent());
address.setZip(Integer.parseInt(element.getElementsByTagName("Zip").item(0).getTextContent()));
address.setCountry(element.getElementsByTagName("Country").item(0).getTextContent());
}
return address;
}
private static Items getItem(Node node) {
Items items = new Items();
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
NodeList comments = element.getElementsByTagName("Comment");
NodeList shipDates = element.getElementsByTagName("ShipDate");
if (comments.getLength() == 1 ) {
items.setComment(element.getElementsByTagName("Comment").item(0).getTextContent());
} else {
items.setComment("No comment specified");
}
if (shipDates.getLength() == 1) {
items.setShipDate(element.getElementsByTagName("ShipDate").item(0).getTextContent());
} else {
items.setShipDate("Ship date not specified");
}
items.setPartNumber(element.getAttribute("PartNumber"));
items.setProductName(element.getElementsByTagName("ProductName").item(0).getTextContent());
items.setQuantity(Integer.parseInt(element.getElementsByTagName("Quantity").item(0).getTextContent()));
items.setUsPrice(Double.parseDouble(element.getElementsByTagName("USPrice").item(0).getTextContent()));
}
return items;
}
}
解决方案
推荐阅读
- coq - 分割向量的尾部并附加相同向量的头部
- r - 在 for 循环中改变
- sql - 将 SQL 转换为 Power BI
- sql - 如何在 SQL 中编写多个“JOIN”和“ON”
- python-3.x - 如何在 FireFox 中使用 Python Selenium 放大网页
- linq - 有没有办法使用 Entity Framework Core 在数据库端获取 ulong 的总和?
- c# - TapGestureRecognizer 在 iOS 和 UWP 中不起作用
- php - 如何使用 php 保存图像源变量
- java - Flux 在任何 java.lang.Error(OOM) 的情况下卡住
- spring-data-mongodb - Spring Data 索引自动创建