【问题标题】:Getting error while parsing an XML 1.1 document with Stax parser使用 Stax 解析器解析 XML 1.1 文档时出错
【发布时间】:2020-01-10 12:11:09
【问题描述】:

我正在尝试解析 Burp Suite XML 导出。我使用过 Stax 解析器和 XPath 解析器。但我得到了

Location: /py/message/viewBill.pt [id parameter]]]></location>
<severity>High</severity>
<confidence>Certain</confidence>
<issueBackground><![CDATA[Reflected 
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[66,2357]
Message: The element type "location" must be terminated by the matching end-tag "< /location>".
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:604)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83)

总是出错。虽然有一个结束标签,但解析器找不到它。我的代码是:

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(new StringReader(str));

while (eventReader.hasNext()) {
    XMLEvent event = eventReader.nextEvent();

    switch (event.getEventType()) {

        case XMLStreamConstants.START_ELEMENT:
            StartElement startElement = event.asStartElement();
            String qName = startElement.getName().getLocalPart();

            if (qName.equalsIgnoreCase(ISSUES)) {
                issues = true;
            } else if (qName.equalsIgnoreCase(ISSUE)) {
                issue = true;
            } else if (qName.equalsIgnoreCase(NAME)) {
                name = true;
            } else if (qName.equalsIgnoreCase(HOST)) {
                host = true;
            } else if (qName.equalsIgnoreCase(PATH)) {
                path = true;
            } else if (qName.equalsIgnoreCase(LOCATION)) {
                location = true;
            } else if (qName.equalsIgnoreCase(SEVERITY)) {
                severity = true;
            }
            break;

        case XMLStreamConstants.CHARACTERS:
            Characters characters = event.asCharacters();
            if (name) {
                System.out.println("Name: " + characters.getData());
                name = false;
            } else if (host) {
                System.out.println("Host: " + characters.getData());
                host = false;
            } else if (path) {
                System.out.println("Path: " + characters.getData());
                path = false;
            } else if (location) {
                System.out.println("Location: " + characters.getData());
                location = false;
            } else if (severity) {
                System.out.println("severity: " + characters.getData());
                severity = false;
            }
            break;

        case XMLStreamConstants.END_ELEMENT:
            EndElement endElement = event.asEndElement();
            String endElementName = endElement.getName().getLocalPart();

            if (endElementName.equalsIgnoreCase(ISSUE)) {
                issue = false;
            } else if (endElementName.equalsIgnoreCase(NAME)) {
                name = false;
            } else if (endElementName.equalsIgnoreCase(HOST)) {
                host = false;
            } else if (endElementName.equalsIgnoreCase(PATH)) {
                path = false;
            } else if (endElementName.equalsIgnoreCase(LOCATION)) {
                location = false;
            } 
            break;
    }
}

我正在尝试解析我在 https://github.com/mtesauro/parse-tools/blob/master/examples/brief-burp-export.xml 上找到的报告。

有人可以给点建议吗?

【问题讨论】:

  • 您使用的是哪个 stax 解析器?我的猜测是它不支持 XML 1.1。你试过xerces吗?
  • @ArvidHeise 我正在使用 xerces。

标签: java xpath stax


【解决方案1】:

我会冒险猜测这是 XML 解析器中的一个错误。具体来说,我怀疑它没有将第 63 行的 ]]]&gt; 识别为终止 CDATA 部分,因此它继续认为它在 CDATA 中,直到第 66 行末尾的 ]]&gt;,此时它找到了结束标记 @ 987654323@ 在哪里寻找 &lt;/location&gt;。向 XML 解析器的供应商提出一张票,或者切换到一个有效的。

【讨论】:

    【解决方案2】:

    我发现了一些使用 CSS 解析 Burp Export 的示例。比我找到Jsoup 用于 Java 中的 CSS 解析。这有点复杂,但效果很好。

    Document document = Jsoup.parse(str);
    Elements allElements = document.getAllElements();
    
    for (Element element : allElements) {
        String tagName = element.tagName();
        String text = element.text();
        if (tagName.equalsIgnoreCase("name")) {
            System.out.println("name " + text);
        } else if (tagName.equalsIgnoreCase("host")) {
            System.out.println("host " + text);
            System.out.println("ip " + element.attr("ip"));
        }
    }
    

    【讨论】:

      【解决方案3】:

      我也面临同样的问题。在网上搜索了一段时间后,我找到了以下解决方案

      由于 xml 值具有 CDATA,事件类型将为 XMLEvent.CDATA 而不是 XMLEvent.CHARACTERS

      Switch(reader.hasNext()) {
      case TAG:
          eventType = reader.next();
          if (eventType == XMLEvent.CDATA || eventType == XMLEvent.CHARACTERS) {
              System.out.println(reader.getText());
          }
          break;
      ........
      }
      

      我还添加了以下依赖项。我不确定这种依赖有什么帮助,但如果没有这种依赖,我们会得到上面提到的同样的异常。

      但添加此依赖后问题得到解决。

      <dependency>
          <groupId>com.fasterxml.woodstox</groupId>
          <artifactId>woodstox-core</artifactId>
          <version>5.0.0</version>
      </dependency>
      

      https://github.com/FasterXML/woodstox https://mvnrepository.com/artifact/com.fasterxml.woodstox/woodstox-core/5.0.0

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 2016-10-30
        • 2016-01-13
        • 2015-12-12
        • 1970-01-01
        • 2012-12-20
        • 2015-12-10
        • 1970-01-01
        相关资源
        最近更新 更多