3

有没有办法在 XML 文件中定位编码问题?我正在尝试使用in 中的库解析这样的文件(我们称之为doc),但编码似乎存在问题。XMLR

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...

又是一个标签列表和行号。我检查了线路,我找不到任何错误。

另一个怀疑:文档中出现的“µ”字符可能会导致错误。所以接下来尝试:

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...

还有其他调试建议吗?

编辑:花了两天时间尝试修复错误后,我仍然没有找到解决方案。但是,我想我已经缩小了可能的答案。这是我发现的:

  • 将字符串从源数据库复制到文件中,并将其保存为Notepad++ --> 中XML的单独文件。xmlDocument 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通过从数据库中读取字符串,使用ordoc <- 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")orto="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 回答