我正在grails应用程序中创建一个xml文件上传器。有两种类型的文件,Ap和ApWithVendor。我想自动检测文件类型并使用SAXParser将xml转换为正确的对象。
当sax解析器无法使用endElement方法在第一个Ap对象中找到qName匹配时,我一直在做的是抛出异常。然后我捕获异常并尝试ApWithVendor对象。
我的问题是,如果没有使用异常检查条件,有更好的方法吗?
代码示例
try {
System.out.println("ApBatch");
Batch<ApBatchEntry> batch = new ApBatchConverter().convertFromXML(new String(xmlDocument, StandardCharsets.UTF_8));
byte[] xml = new ApBatchConverter().convertToXML(batch, true);
String xmlString = new String(xml, StandardCharsets.UTF_8);
System.out.println(xmlString);
errors = client.validateApBatch(batch);
if (!errors.isEmpty()) {
throw new BatchValidationException(errors);
}
return;
} catch (BatchConverterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
System.out.println("ApVendorBatch");
Batch<ApWithVendorBatchEntry> batch = new ApWithVendorBatchConverter().convertFromXML(new String(xmlDocument, StandardCharsets.UTF_8));
byte[] xml = new ApWithVendorBatchConverter().convertToXML(batch, true);
String xmlString = new String(xml, StandardCharsets.UTF_8);
System.out.println(xmlString);
errors = client.validateApWithVendorBatch(batch);
if (!errors.isEmpty()) {
throw new BatchValidationException(errors);
}
return;
} catch (BatchConverterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:1)
首先尝试将XML字符串转换为XML树对象,然后使用XPath来确定它是否是ApWithVendor结构。即检查是否有像&#34; / application / foo / vendor&#34;结构中的路径。 确定后,将XML树对象转换为对象。
答案 1 :(得分:1)
您总是可以迭代XML中的节点,并根据特定节点丢失(或存在 - 或具有特定值)的事实做出决定(请参阅DocumentBuilder
和Document
类)< / p>
在99%的情况下使用例外进行决策或流量控制被认为是不好的做法。