-2

smack api を使用してチャット アプリケーションを作成しています。この文字を含むメッセージを送信すると'、出力は次のようになります

メッセージ==奥様

出力==

'

午前

ここにコードがあります

  StringEscapeUtils.unescapeHtml((new String(ch, start, length).replace("'", "`").replace("'", "'")));

ここにコードがあります

DefaultHandler handler = new DefaultHandler() {
                @Override
                public void startDocument() throws SAXException {
                }

                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {                        
                        for (int i = 0; i < attributes.getLength(); i++) {
                            if (attributes.getLocalName(i).equalsIgnoreCase("from")) {
                                from = attributes.getValue(i);
                                break;
                            }
                        }                        
                   ....
                }

                @Override
                public void characters(char ch[], int start, int length) throws SAXException {
                    String str = StringEscapeUtils.unescapeHtml((new String(ch, start, length)));                    
                    switch (elementType) {
                        case 1:
                            msg = str;
                            break;
                     ...
                        default:
                           ...
                            break;
                    }
//                  

                @Override
                public void endElement(String uri, String localName, String qName) throws SAXException {
                }

                @Override
                public void endDocument() throws SAXException {
                }
4

1 に答える 1

1

多くの場合、XML パーサーはテキスト要素を複数の文字ノードに分割します。これは、XML の観点からは完全に有効です。したがって、これを適切に処理する必要があります。したがって、問題はエスケープ解除ではなく、印刷から発生する可能性があります。

たとえば、次の XML を想像できます

<n>A &amp; B</n>

次のイベントを生成します。

  1. 開始ノードn
  2. テキストノード " A"
  3. テキストノード " &amp;"
  4. テキストノード " B"
  5. 終了ノードn

これで、printlnすべての文字の「もの」を表示すると、1 行ではなく 3 行になります。おそらく、パーサーには、イベントを強制的に「正規化」して、連続するテキストノードを結合するオプションがあります。

(適切な XML 用語をすべて使用していない場合は申し訳ありません。私の XML 用語は少し錆びているので、この質問を編集して正しい XML 用語を入力してください。ありがとうございます)

于 2012-11-17T11:01:08.007 に答える