【问题标题】:Debugging encoding problems (R XML)调试编码问题 (R XML)
【发布时间】:2012-11-09 19:33:06
【问题描述】:

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

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

还有什么其他的调试建议?

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

  • 将源数据库中的XML 字符串复制到一个文件中,并在Notepad++ 中将其另存为xml 文件 --> Document labelled UTF-16 but has UTF-8 content

  • 在此文件中将&lt;?xml version="1.0" encoding="utf-16"?&gt; 更改为&lt;?xml version="1.0" encoding="utf-8"?&gt;(或encoding="latin1") --> 没有错误

  • 通过doc &lt;- sqlQuery(myconn, query.text, stringsAsFactors = FALSE); doc &lt;- doc[1,1]从数据库中读取XML字符串,使用str_sub(doc, 35, 36) &lt;- "8"str_sub(doc, 31, 36) &lt;- "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 &lt;- iconv(doc[1,1], to="UTF-8")to="latin1" 不会改变任何东西

如果有任何建议,我将不胜感激。

【问题讨论】:

  • 如果没有可重复的例子,很难回答这种性质的问题
  • @hadley 我不知道如何在这里提供 MWE。当我将文档标题中的“UTF-16”更改为“UTF-8”,然后将此文件的内容复制到另一个空文件中并以完全相同的方式保存时,Document labelled UTF-16... 错误消失了。更改原始文件中的标题并保存更改没有帮助。但是我不能每次都使用这个过程,因为我需要这个脚本来自动处理数据库中的数据。我很困惑,不知道如何调试,甚至不知道如何提供示例,因为它似乎不是导致问题的内容本身。
  • 我知道我在几个月前调试了一个类似的问题,但我不记得我做了什么。您可以尝试的另一件事是使用 xmlInternalTreeParse(file(doc, encoding = "utf-16")) 加载 xml 并查看在那里设置编码是否有帮助。
  • @hadley 感谢您的建议。我编辑了我的第一篇文章,并列出了迄今为止我尝试过的事情。我确实尝试指定编码,但这没有帮助。奇怪的是,使用 Notepad++ 将保存的文件中的 utf-16 替换为 utf-8latin1 可以解决问题。但是在将 XML 字符串从 SQL 数据库导入到 R 对象后,通过字符串操作来做同样的事情并没有帮助。
  • 仅供参考,您的 iconv 调用不太可能是正确的 - 您通常需要同时指定 from 和 to。

标签: xml r debugging encoding xml-parsing


【解决方案1】:

发生编码问题的原因是原始 XML 文件的编码与将 XML 内容存储为 longtext 的 SQL 数据库中的编码不匹配。替换 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 字符串原来是一个单独的问题。解决方案在这里提供:How to retrieve a very long XML-string from an SQL database with R?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多