[英]Java DOM parser not parsing one line XML
我有这个单行xml文件 (没有缩进和换行符),如下所示
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.03"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.03
camt.054.001.03.xsd">
<BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>0000000006</MsgId>
<CreDtTm>2013-04-
16T14:38:00</CreDtTm>
</GrpHdr>
</BkToCstmrDbtCdtNtfctn></Document>
我正在使用此Java DOM解析器程序来解析和检索值
import java.io.File;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class GetNodeValues {
static String value = null;
static ArrayList alist = null;
/****************** GET XPATH FOR EACH TAG **************************************/
public static String getXPath(Element elemnt) {
String xpath = null;
String curNode = elemnt.getNodeName();
ArrayList<String> al = new ArrayList<String>();
al.add(curNode);
// al.add(parNode);
while (!elemnt.getParentNode().getNodeName().equals("#document")) {
al.add(elemnt.getParentNode().getNodeName());
elemnt = (Element) elemnt.getParentNode();
}
for (int i = al.size() - 1; i >= 0; i--) {
xpath = xpath + "/" + al.get(i);
}
return xpath.replaceAll("null", "");
}
/******************************************************************************************/
/**************************** GET TAG NAMES AND VALUES ***********************/
public static ArrayList getValues() {
try {
alist = new ArrayList();
String xmlFile = "C:/Users/Administrator/Desktop/sample2.xml";
File file = new File(xmlFile);
if (file.exists()) {
// Create a factory
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
// Use the factory to create a builder
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
doc.getDocumentElement().normalize();
// Get a list of all elements in the document
NodeList list = doc.getElementsByTagName("*");
for (int i = 0; i < list.getLength(); i++) {
// Get element
Element element = (Element) list.item(i);
String nodnam = element.getNodeName();
if (element.getChildNodes().getLength() > 0) // then it has
// text
{
String val = element.getChildNodes().item(0)
.getNodeValue();
if (val.startsWith("\n")) { // Discarding pseudo nodes
} else {
value = nodnam + " > " + val + " > "
+ getXPath(element); // print node names and
// values
System.out.println(value);
alist.add(value);
}
}
}
} else {
System.out.print("File not found!");
}
} catch (Exception e) {
System.exit(1);
}
return alist;
}
/********************************************************************************************/
/************************** MAIN METHOD **********************************************/
public static void main(String[] args) {
System.out.println(getValues());
}
}
并且它不打印任何值。 但是,如果我编辑xml文件并添加缩进和这样的新行
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.03 camt.054.001.03.xsd">
<BkToCstmrDbtCdtNtfctn>
<GrpHdr>
<MsgId>0000000006</MsgId>
<CreDtTm>2013-04-16T14:38:00</CreDtTm>
</GrpHdr>
</BkToCstmrDbtCdtNtfctn>
</Document>
然后我得到如下输出
MsgId > 0000000006 > /Document/BkToCstmrDbtCdtNtfctn/GrpHdr/MsgId
CreDtTm > 2013-04-16T14:38:00 > /Document/BkToCstmrDbtCdtNtfctn/GrpHdr/CreDtTm
所以问题是我不能编辑每个XML文件。 要处理的文件数量巨大。 我在Java dom解析器中缺少什么吗? 我所需要的只是该程序应该解析和打印没有缩进和换行的xml文件的值。
请注意,通过执行以下操作:
} catch (Exception e) {
System.exit(1);
}
您正在隐藏异常,而看不到真正的问题。 至少打印堆栈跟踪,例如:
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
在这种情况下,来自String val = element.getChildNodes().item(0).getNodeValue();
的var
String val = element.getChildNodes().item(0).getNodeValue();
可以为null。 因此,使用以下修复程序可以解决此问题:
String val = element.getChildNodes().item(0).getNodeValue();
if (val != null) {
if (val.startsWith("\n")) { // Discarding pseudo nodes
} else {
value = nodnam + " > " + val + " > "
+ getXPath(element); // print node names and
// values
System.out.println(value);
alist.add(value);
}
}
除了导致NPE的实际问题之外,我认为您的代码目前存在3个不同的问题:
} catch (Exception e) {
System.exit(1);
}
第一个问题(如@dan所示)是您没有打印堆栈跟踪。
第二个问题是您正在捕获Exception
。 在大多数情况下,这是一个坏主意,因为除了可能会遇到的任何异常之外,您最终还会捕获各种意外异常。 最好只捕获您期望并可以处理的异常。 它们的其余部分应被允许传播。
第三个问题是您正在使用似乎是实用程序方法的方式调用System.exit
。 出于以下几个原因,这是一个坏主意:
保全方法将使该方法在其他情况下难以使用...保全是错误的事情。
任何调用System.exit的方法都将很难进行单元测试。 如果您不采取措施避免发生这种情况(例如,使用可以“模拟”该调用的模拟框架)该方法将导致运行单元测试的JVM立即停止。
我认为,编写该代码的正确方法是:
throws
子句添加到getValues()
方法声明中,然后 try ... catch
放入main
方法中...附带一些代码以输出或记录异常stacktrace。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.