SSブログ

XMLからNameSpaceを削除@Java [Java]

JavaでXMLを扱う際、XMLにNameSpace(名前空間、ネームスペース)が付いている場合、NameSpaceを削除するにはどうするんだろうといろいろWebで検索したもののこれといった方法が見つからない。
とにかく手っ取り早くNameSpaceを取っ払えればよいので、正直コードの美しさとかはこの際考えない。
で、たどり着いたのがstackoverflowの以下の記事。
How do I remove namespaces from xml, using java dom?
正規表現で解決ということですね。
public static String removeXmlStringNamespaceAndPreamble(String xmlString) {
  return xmlString.replaceAll("(<\\?[^<]*\\?>)?", ""). /* remove preamble */
  replaceAll("xmlns.*?(\"|\').*?(\"|\')", "") /* remove xmlns declaration */
  .replaceAll("(<)(\\w+:)(.*?>)", "$1$3") /* remove opening tag prefix */
  .replaceAll("()", "$1$3"); /* remove closing tags prefix */
}

すばらしい。
が、ちょっと思っていたのと違うぞ。
w3.orgから引っ張ってきた以下のNameSpace付のXMLサンプルを喰わせると、こんな感じになるのです。

変換前
<?xml version="1.1"?>
<!-- both namespace prefixes are available throughout -->
<bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>
<bk:title>Cheaper by the Dozen</bk:title>
<isbn:number>1568491379</isbn:number>
</bk:book>

変換後
<!-- both namespace prefixes are available throughout -->
<book  >
<title>Cheaper by the Dozen</title>
<number>1568491379</number>
</book>


まずxml宣言が消されてしまうのと、xmlnsが付いていたタグ(bookの閉じタグ前)に変なスペースが残ってしまう。これだとちょっと意図とは違うので、ちょこっと修正して以下のようにしてみました。
public static String removeXmlStringNamespaceAndPreamble(String xmlString) {
    return xmlString.replaceAll("\\s*xmlns.*?(\"|\').*?(\"|\')\\s*", "") /* remove xmlns declaration */
    .replaceAll("(<)(\\w+:)(.*?>)", "$1$3") /* remove opening tag prefix */
    .replaceAll("()", "$1$3"); /* remove closing tags prefix */
}

先ほどの名前空間付XMLを喰わせると以下のように出力されます。
<?xml version="1.1"?>
<!-- both namespace prefixes are available throughout -->
<book>
<title>Cheaper by the Dozen</title>
<number>1568491379</number>
</book>

というわけで、とりあえずはこれで凌ぐことにしました。
(ちなみにバグがあっても責任もてませんので、あしからず。)
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。