1

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

1 回答 1

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 相关的更改。

于 2013-10-16T21:12:10.843 回答