3

XML ファイル内のエンコーディングの問題を特定する方法はありますか? そのようなファイル ( と呼びましょうdoc) を のXMLライブラリで解析しようとしていますRが、エンコーディングに問題があるようです。

xmlInternalTreeParse(doc, asText=TRUE)
Error: Document labelled UTF-16 but has UTF-8 content.
Error: Input is not proper UTF-8, indicate encoding!
Error: Premature end of data in tag ...

そして、データの終わりが早すぎると思われるタグのリストが続きます。ただし、このドキュメントに時期尚早な終わりが存在しないことは確かです。

では、次を試してみてください。

doc <- iconv(doc, to="UTF-8")
doc <- sub("utf-16", "utf-8", doc)
xmlInternalTreeParse(doc, asText=T)
Error: Premature end of data in tag...

また、タグのリストが行番号とともに続きます。行を確認しましたが、エラーは見つかりません。

もう 1 つの疑惑: ドキュメント内に出現する "µ" 文字がエラーの原因である可能性があります。次に試してみてください:

doc <- iconv(doc, to="UTF-8")
doc <- gsub("µ", "micro", doc)
doc <- sub("utf-16", "utf-8", doc)
xmlInternalTreeParse(doc, asText=T)
Error: Premature end of data in tag...

デバッグに関するその他の提案はありますか?

編集:エラーの修正に 2 日間費やしましたが、まだ解決策が見つかりません。しかし、考えられる答えを絞り込んだと思います。これが私が見つけたものです:

  • XMLソース データベースから文字列をファイルにコピーし、それを別のxmlファイルとして Notepad++ に保存します --> Document labelled UTF-16 but has UTF-8 content.

  • このファイル内で (または) に<?xml version="1.0" encoding="utf-16"?>変更<?xml version="1.0" encoding="utf-8"?>-- >エラーなしencoding="latin1"

  • XML経由でデータベースから文字列を読み取り、またはdoc <- sqlQuery(myconn, query.text, stringsAsFactors = FALSE); doc <- doc[1,1]で操作してから-->で解析しようとしていますstr_sub(doc, 35, 36) <- "8"str_sub(doc, 31, 36) <- "latin1"xmlInternalTreeParse(doc)Premature end of data in tag...

  • 上記のようにデータベースから文字列を読み取り、-->XMLで解析しようとします(タグのリストは次のとおりです)。xmlInternalTreeParse(doc)Document labelled UTF-16 but has UTF-8 content. Input is not proper UTF-8, indicate encoding ! Bytes: 0xE4 0x64 0x2E 0x20 Premature end of data in tag...

  • 上記のようにデータベースから文字列を読み取り、-->XMLで解析しますxmlInternalTreeParse(doc, encoding="latin1")Premature end of data in tag...

  • doc <- iconv(doc[1,1], to="UTF-8")解析前にorを使用してto="latin1"も何も変わりません

提案をいただければ幸いです。

4

1 に答える 1

3

エンコーディングの問題は、元の XML ファイルのエンコーディングと、XML コンテンツが保存されている SQL データベース内のエンコーディングがlongtext一致しなかったために発生しました。XML 文字列内のエンコーディングの仕様を置き換え、この文字列を変換すると、問題が解決しました。

doc <- sqlQuery(myconn, query.text, stringsAsFactors = FALSE)
doc <- iconv(doc[1,1], to="UTF-8")
doc <- sub("utf-16", "utf-8", doc)
doc <- xmlInternalTreeParse(doc, asText = TRUE)

データベースから取得する際の XML 文字列の切り捨ては、別の問題であることが判明しました。解決策は次のとおりです: R を使用して SQL データベースから非常に長い XML 文字列を取得する方法は?

于 2012-12-05T14:00:27.323 に答える