0

DOMまたはSAXを使用してJavaでxmlファイルを解析しようとしています。問題は、解析中に、xmlに<> "のような特殊文字としてatteibute値が含まれている場合、パーサーはParserExceptionをスローします。

たとえば、xmlファイル:

<?xml version="1.0" encoding="UTF-8"?>
<abc>
<check name="bike" value="apache <nice model"/> 
<check name="car" value="tata sumo "style" />
</abc>

この例では、xml要素チェックに属性値があり、<または "が含まれています。パーサーはそれを無効と見なし、パーサー例外をスローします。

今私の問題は、xmlファイルをパーサーに解析する前に、xmlファイルの属性値でその特殊文字(<または>または ")を検出し、その記号(<>")をスペースに置き換える必要があることです。

例:xmlに<が含まれている場合

<check name="bike" value="apache <nice model"/> 

スペースに置き換えます

<check name="bike" value="apache  nice model"/> 

。提案をお願いします。どのような方法で実行できますか...XSDを使用して実行できますか...

前もって感謝します。

4

3 に答える 3

0

それらのシンボルをエンティティに置き換えるのはどうですか?

&apos; is an apostrophe: '
&amp; is an ampersand: &
&quot; is a quotation mark: "
&lt; is a less-than symbol: <
&gt; is a greater-than symbol: >
于 2012-09-22T08:35:25.380 に答える
0

それが本当にxmlであるかどうかを議論することができます。1つのルールは、xmlは整形式でなければならないということです。つまり、タグには開始と終了が必要であり、特定の文字(特に属性の<>)はすべての場所で許可されていません。

ソースからこれを修正できない場合、つまり整形式のxmlを生成できない場合は、最初に単純な検索を実行し、@ Visherが提案するように置き換えてから、xmlとして扱うか、独自のパーサーを考え出す必要があると思います。

于 2012-09-22T08:37:21.003 に答える
0

このコードはうまく機能します (引用符内の '<' と '>' を置き換えます)。

public static void main(String[] args)
{
    char[] characters = new char[]{'<', '>'};
    String[] entities = new String[]{"&lt;", "&gt;"};

    String text = "<check name=\"bike\" value=\"apache <nice model\"/> ";
    StringBuilder sb = new StringBuilder();
    boolean insideQuotation = false;

    for (int i = 0; i < text.length(); i++)
    {
        char character = text.charAt(i);

        if (insideQuotation)
        {
            int index = -1;

            for (int x = 0; x < characters.length; x++)
            {
                if (characters[x] == character)
                {
                    index = x;
                    break;
                }
            }

            if (index != -1)
                sb.append(entities[index]);

            else
                sb.append(character);

            if (character == '"')
                insideQuotation = false; 
        }
        else
        {
            if (character == '"')
                insideQuotation = true;

            sb.append(character);
        }
    }

    System.out.println(sb.toString());
}

引用符の中に別の引用符を追加すると問題が発生します。

于 2012-09-22T09:45:12.797 に答える