将XML转换为CSV的代码具有NullPointerException

时间:2013-10-16 20:10:47

标签: java xml csv

我遇到的当前问题与此处回答的问题几乎完全相同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|

1 个答案:

答案 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相关的其他更改相关更改。