1

我正在获取带有以下标签的 XML。我所做的是,使用 Sax 解析器用 Java 读取 XML 文件并将它们保存到数据库中。但似乎在 p 标签之后有空格,如下所示。

     <Inclusions><![CDATA[<p>                                               </p><ul> <li>Small group walking tour</li> <li>Entrance fees</li> <li>Professional guide </li> <li>Guaranteed to skip the long lines</li> <li>Headsets to hear the guide clearly</li> </ul>
                <p></p>]]></Inclusions>

但是当我们将读取的字符串插入数据库(PostgreSQL 8)时,它会为这些空格打印如下所示的错误字符。

\011\011\011\011\011\011\011\011\011\011\011\011

  • 小团体徒步旅行
  • 入场费
  • 专业指导
  • 保证跳过排长队
  • 耳机可以清楚地听到指南
\012\011\011\011\011\011

  1. 我想知道为什么会这样打印坏字符(011\011)?

  2. 用java删除XML标签内空格的最佳方法是什么?(或者如何防止那些坏字符。)

我已经检查了样本,其中大部分都带有 python 样本。

这就是在我的程序中使用 SAX 读取 XML 的方式,

方法一

  // ResultHandler is the class that used to read the XML. 
  ResultHandler handler         = new ResultHandler();
   // Use the default parser
  SAXParserFactory factory = SAXParserFactory.newInstance();
    // Retrieve the XML file
    FileInputStream in = new FileInputStream(new File(inputFile)); // input file is XML.
    // Parse the XML input
    SAXParser saxParser = factory.newSAXParser();
    saxParser.parse( in , handler);

这就是 ResultHandler 类使用 Method-1 将 XML 作为 Sax 解析器读取的方式

import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

// other imports

    class ResultHandler extends DefaultHandler {

        public void startDocument ()
        {
            logger.debug("Start document");         
        }

        public void endDocument ()
        {
            logger.debug("End document");
        }

        public void startElement(String namespaceURI, String localName, String qName, Attributes attribs)
        throws SAXException {           
            strValue = "";      
            // add logic with start of tag. 
        }

        public void characters(char[] ch, int start, int length)
        throws SAXException {
            //logger.debug("characters");
            strValue += new String(ch, start, length);
            //logger.debug("strValue-->"+strValue);
        }

        public void endElement(String namespaceURI, String localName, String qName)
        throws SAXException {           
            // add logic to end of tag. 
        }
    }

所以需要知道,如何使用 sax 解析器设置 setIgnoringElementContentWhitespace(true) 或类似的。

4

2 回答 2

4

你可以尝试为你的DocumentBuilderFactory

setIgnoringElementContentWhitespace(true)

因为这:

由于依赖于内容模型,此设置要求解析器处于验证模式

你还需要设置

setValidating(true)

或者str= str.replaceAll("\\s+", "");也可以工作

于 2012-04-23T08:43:29.733 回答
1
  1. 我也在寻找一个确切的答案。但认为这对你有帮助。
    C/Modula-3 八进制表示法;vs此链接
    中的含义 它说

    • \011 用于水平制表符(ASCII HT)
    • \012 用于换行(ASCII NL,换行符)
  2. 您可以将多个空格替换为一个空格,如下所示

    str = str.replaceAll("\s([\s])+", "");

于 2012-04-23T08:30:37.730 回答