1

私が取り組んでいる (Java) コードでは、次のStringような整形式でない XML ( Java として表される) を扱うことがあります。

<root>
  <foo>
    bar & baz < quux
  </foo>
</root>

この XML は最終的に (JAXB を使用して) 非整列化する必要があるため、明らかにこの XML は非整列化時に例外をスローします。

&<をその文字エンティティに置き換える最良の方法は何ですか? の場合&、次のように簡単です。

xml.replaceAll("&", "&amp;")

ただし、シンボルについては、「ブラケット」を開く XML タグに使用されているもの<を置き換えたくないので、少し注意が必要です。<

文字列をスキャンして手動で<XML 本文を に置き換える&lt;以外に、他にどのようなオプションを提案できますか?

4

3 に答える 3

4

率直に言って、不正な XML を修復する最善の方法は、その XML を作成した人に送り返し、代わりに正しい形式の XML を送信するよう依頼することです。あなたは簡単な例を示していますが、これには解決策がある可能性がありますが、不正な形式の XML を修復するための一般的な方法は恐ろしい仕事になるでしょう。

また、XML パーサーは不正な形式の XML を処理する必要がないため、パーサーもその必要はありません。やらないでください。

于 2010-06-10T04:49:53.533 に答える
1

もっと高度なロジックが必要だと思います。最初に "(<[^>]+>)" のような正規表現を使用してすべての実際のタグを見つけ、それらの一致以外のテキストのみを置き換えるのが最善ですが、明らかに replaceAll メソッドを使用することはできません。配管工事になります。...

于 2010-06-09T18:16:57.507 に答える
1

古い投稿ですが、他の人に役立つかもしれないと思いました..同じ要件/問題があり、次のコードを使用して解決できました。

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class XMLTest {

/**
* @param args
*/

public static void main(String[] args) {

String xml = "<xml><body>" +
"<message>something < between <<<  somthing </message>" +
"<text> testing  >> > testing </text>" +
"</body></xml>";

Pattern replaceGTPattern = Pattern.compile(">[^<](.[^<]*)(>)+");

Matcher m = replaceGTPattern.matcher(xml);

String replacement;
StringBuffer intermXml = new StringBuffer();


while(m.find()){

    replacement = ">"+m.group(0).substring(1).replaceAll(">", ";&gt");


    m.appendReplacement(intermXml,replacement);


    }


    m.appendTail(intermXml);

Pattern replaceLTPattern = Pattern.compile("<(.[^>]*)(<)+");

m = replaceLTPattern.matcher(intermXml);

StringBuffer finalXml = new StringBuffer();

while(m.find()){

    replacement = m.group(0).substring(0,m.group(0).length()-1).replaceAll("<", ";&lt").concat("<");


    m.appendReplacement(finalXml,replacement);


    }

    m.appendTail(finalXml);

    System.out.println(finalXml);

}
}
于 2011-02-04T11:28:58.823 に答える