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 を読み取る方法です。

方法 1

  // 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);

これは、メソッド 1 を使用して ResultHandler クラスが 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. 
        }
    }

setIgnoringElementContentWhitespace(true) などを sax パーサーで設定する方法を知る必要があります。

4

2 に答える 2

4

あなたはあなたのために設定しようとすることができますDocumentBuilderFactory

setIgnoringElementContentWhitespace(true)

このため:

コンテンツ モデルに依存しているため、この設定ではパーサーを検証モードにする必要があります。

あなたも設定する必要があります

setValidating(true)

または、str= str.replaceAll("\\s+", "");うまくいくかもしれません

于 2012-04-23T08:43:29.733 に答える
1
  1. 私も正確な答えを見つけています。しかし、これはあなたにとって役立つと思います。
    C/Modula-3 8 進表記。対このリンク
    には意味があります

    • \011 は水平タブ用 (ASCII HT)
    • \012 は改行用 (ASCII NL、改行)
  2. 次のように、複数のスペースを 1 つのスペースに置き換えることができます。

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

于 2012-04-23T08:30:37.730 に答える