我遇到的当前问题与此处回答的问题几乎完全相同Convert XML file to CSV。我承认我不太了解Java,我自己编写了几乎这么复杂的东西。我可以编写很多其他语言的脚本,但Java从来没有对我有任何意义。但是,我通常可以很好地适应其他程序。我坚持这个,但是当我尝试从接受的答案中运行代码(没有任何修改)时,我得到以下内容......
>java App
Exception in thread "main" java.lang.NullPointerException
at App$HeaderHandler.addItemHeader(App.java:76)
at App$HeaderHandler.endElement(App.java:99)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at App.main(App.java:23)
现在,我知道这意味着我在第76行至少有一个变量未初始化,它不应该是空值。我尝试通过在它之前放置String headerName = new String("default");
来初始化它,这阻止了它甚至编译:
App.java:76: headerName is already defined in addItemHeader(java.lang.String)
String headerName = new String("default");
我不知道从哪里去。这是第75-81行的代码
private void addItemHeader(String headerName) {
if (itemHeader.containsKey(headerName)) {
itemHeader.put(headerName, itemHeader.get(headerName) + 1);
} else {
itemHeader.put(headerName, 1);
}
}
如果我可以获得此代码,或者任何类似代码,如果有人想要提出另一种方法,那么我相信我可以做一些小改动并调整代码。
如果没有人能弄清楚如何修复NullPointerException,我也会接受任何其他采用类似于以下XML的Java解决方案。
<?xml version="1.0" encoding="ISO-10646-UCS-2" standalone="yes" ?>
<ROOT DATE_CREATED="1970-01-01 00:00:01" CREATED_BY="Log Parser">
<ROW>
<EventLog>
Exception
</EventLog>
<RecordNumber>
1381938446
</RecordNumber>
<Message>
An Error Occurred
</Message>
<Data>
</Data>
</ROW>
</ROOT>
并使用任何类型的分隔符将其转换为Rows的平面列表,例如......
Exception|1381938446|An Error Occurred||
Exception|1382348446|Next Error|Some Data Here|
答案 0 :(得分:1)
我认为问题可能就在这里
public void startElement(String uri, String name,
String qName, Attributes atts) {
if ("item".equalsIgnoreCase(qName)) {
itemHeader = new LinkedHashMap<String, Integer>();
}
itemHeader 仅在找到开始标记时进行初始化。因此,除非你的Xml开头,否则你将得到当前的错误。
尝试更改
private LinkedHashMap<String, Integer> itemHeader;
到
private LinkedHashMap<String, Integer> itemHeader = new LinkedHashMap<String, Integer>();
但是您需要仔细查看代码,还会有与您的特定Xml相关的其他更改相关更改。