gpt4 book ai didi

java - 如何使用 Java 中的 SAX 解析器更新文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:12 25 4
gpt4 key购买 nike

我正在使用 SAX 解析器从 xml 读取数据。现在我想使用 SAX 解析器修改数据。我该怎么做?

我的 XML 文件是,

<ProductCatalog>
<item id="w1" type="SmartWatches">
<name>Apple Watch</name>
<price>400</price>
<image>abc.jpg</image>
<manufacturer>Apple</manufacturer>
<condition>New</condition>
<discount>10</discount>
<accessories>
<accessory>charger</accessory>
<accessory>belt</accessory>
</accessories>
</item>

<item id="w2" type="SmartWatches">
<name>Apple Watch</name>
<price>400</price>
<image>abc.jpg</image>
<manufacturer>Apple</manufacturer>
<condition>New</condition>
<discount>10</discount>
<accessories>
<accessory>charger</accessory>
<accessory>belt</accessory>
</accessories>
</item>
</ProductCatalog>

这也是我在 java 中实现的 SAX 解析器。

public class UserHandler extends DefaultHandler {
private Item item;
private String value;
private String filePath;
private Map<String, Item> map = new HashMap<String, Item>();

UserHandler(String filePath) {
this.filePath = filePath;
parseDocument();
printValue();
}

private void printValue() {
Set keys = map.keySet();
for (Iterator i = keys.iterator(); i.hasNext();) {
String key = (String) i.next();
System.out.println("Key : " + key);

Item itemDemo = map.get(key);
System.out.println("Name : " + itemDemo.getName());
System.out.println("Price : " + itemDemo.getPrice());
System.out.println("Image : " + itemDemo.getImage());
System.out.println("Manufacturer : " + itemDemo.getManufacturer());
System.out.println("Condition : " + itemDemo.getCondition());
System.out.println("Discount : " + itemDemo.getDiscount());
System.out.println("Accessories : " + itemDemo.getAccessories().toString());
}
}

private void parseDocument() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(filePath, this);
} catch (ParserConfigurationException e) {
System.out.println("ParserConfig error");
} catch (SAXException e) {
System.out.println("SAXException : xml not well formed");
} catch (IOException e) {
e.printStackTrace();
}
}

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("item")) {
item = new Item();
item.setId(attributes.getValue("id"));
item.setType(attributes.getValue("type"));
}
}

public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("item")) {
map.put(item.getId(), item);
return;
}
if (qName.equalsIgnoreCase("name")) {
item.setName(value);
return;
}
if (qName.equalsIgnoreCase("price")) {
item.setPrice(value);
return;
}
if (qName.equalsIgnoreCase("image")) {
item.setImage(value);
return;
}
if(qName.equalsIgnoreCase("manufacturer")){
item.setManufacturer(value);
return;
}
if(qName.equalsIgnoreCase("condition")){
item.setCondition(value);
return;
}
if(qName.equalsIgnoreCase("discount")){
item.setDiscount(value);
return;
}
if(qName.equalsIgnoreCase("accessory")){
item.getAccessories().add(value);
return;
}
}

public void characters(char[] ch, int start, int length) throws SAXException {
value = new String(ch, start, length);
}
}

如何修改 XML 文件中的特定属性?这些更改也应该复制到文件中。我无法使用 DOM 解析器。

最佳答案

首先,您似乎正在通过 SAX 解析器手动执行一些 XML 对象绑定(bind)。使用 JAXB, which takes care of this for you 会更有意义。由于您已经拥有一个具有必要属性(getter/setter)的 Item 类,因此可能需要最少的 JAXB 注释和一个 ProductCatalog 类(带有 Item 列表)才能将 XML 完全解码 为对象,并将对象编码 为 XML。

根据您想要如何改变事物,有几种可能的方法。如果您想要更改 XML 的内容,但不想更改元素或属性的名称或更改 namespace 之类的操作,那么使用上面提到的 JAXB 将 XML 转换为 Java 对象,对其进行操作并将它们转换回 XML 就足够了。用于执行 JAXB 编码/解码的代码非常少,其余的都将通过熟悉的 Java 代码处理 POJO。

如果您想彻底改变 XML 的结构,或者执行诸如重命名元素/属性之类的操作,那么您可能希望查看 XSLT, which is an XML-based transformation language 。 Java 中的 XSLT 处理快速且高效。这需要一些时间来适应,但只要有正确的心态,XSLT 就会成为操作 XML 的非常强大的工具。

JAXB 和 XML 转换 API 长期以来一直是 Java SE API 的一部分,标准 Java 运行时包括 JAXB 2 和 XSLT 1 的默认实现。如果您需要其他功能,实现是可插入的。例如 Moxy(一种具有更高级绑定(bind)功能的 JAXB 实现)和 Saxon(XSLT 2 的实现)。

您甚至可以结合这些技术。您可以在进行 XSLT 转换时使用 JAXB 从 XML 文件中解码 Java 对象,反之亦然:通过 XSLT 将 Java 对象发送到 XML。

关于java - 如何使用 Java 中的 SAX 解析器更新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46461412/

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