包含特殊字符的解析值" /"使用SAX解析器

时间:2017-11-24 05:48:10

标签: java xml sax saxparser

我有以下xml结构

  <fs:AsReportedItem>
     <fs:BookMark>/BODY[1]/DIV[3135]/DIV[0]/TABLE[0]/TBODY[0]/TR[32]/TD[5]/DIV[0]/FONT[0]/substr(1,2)
     </fs:BookMark>
  </fs:AsReportedItem>

我正在使用SAX解析并在endElement()方法中读取税值

这是我的示例代码

private void parseDocument() {
        // parse
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            parser.parse(FileName, this);
        } catch (ParserConfigurationException e) {
            System.out.println("ParserConfig error");
        } catch (SAXException e) {
            System.out.println("SAXException : xml not well formed");
        } catch (IOException e) {
            System.out.println("IO error");
        }
    }

public void startElement(String s, String s1, String elementName, Attributes attributes) throws SAXException {

if (OrgDataPartitonObj != null && "fs:FinancialStatementLineItemDataItem".equals(OrgDataPartitonObj.getType())) {

                FinancialStatementLineItemParser.startFinancialStatementLineItemParser(OrgDataPartitonObj,financialStatementLineItemObj, elementName, attributes);

            }
        }


public void endElement(String s, String s1, String element) throws SAXException {

if (OrgDataPartitonObj != null && "fs:FinancialStatementLineItemDataItem".equals(OrgDataPartitonObj.getType())) {

                 FinancialStatementLineItemParser.getEndElementFinancialStatementLineItemParser(financialStatementLineItemObj, element, tmpValue);
        }
}


public static void getEndElementFinancialStatementLineItemParser(FinancialStatementLineItem financialStatementLineItemObj, String element, String tmpValue) {

            if (element.equals("fs:BookMark")) {
            financialStatementLineItemObj.setBookMark(tmpValue);
        }

    }
   @Override
    public void characters(char[] buffer, int start, int length) {
        tmpValue = new String(buffer, start, length);
    }

当我调试时,我只能看到此值/substr(1,2) "/"的所有值都已转义

我不知道为什么我没有得到全价/BODY[1]/DIV[3135]/DIV[0]/TABLE[0]/TBODY[0]/TR[32]/TD[5]/DIV[0]/FONT[0]/substr(1,2)

如果使用了任何转义字符,那么我必须使用它。

3 个答案:

答案 0 :(得分:1)

这里收集文本的DefaultHandler的源代码:

private static DefaultHandler getHandler() {
    return new DefaultHandler() {
        String text;

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            if ("BookMark".equals(qName)) {
                text = "";
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            text += new String(ch).trim();
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if ("BookMark".equals(qName)) {
                System.out.println("endElement: " + text);
            }
        }

    };
}

答案 1 :(得分:1)

您需要将字符() - 方法更改为

@Override
public void characters(char[] buffer, int start, int length) {
    tmpValue += new String(buffer, start, length);
}

并且必须将startElement()方法中的tmpValue重置为“”。

答案 2 :(得分:0)

只需更改character()方法

即可
obj.Fee = user_fee

并在endElement方法的最后一行添加。

@Override
    public void characters(char[] buffer, int start, int length) {
        tmpValue += new String(buffer, start, length);
    }