我正在关注Parseing XML by R always return XML declaration error
的回答lines <- readLines("ipg140722.xml")
start <- grep('<?xml version="1.0" encoding="UTF-8"?>',lines,fixed=T)
end <- c(start[-1]-1,length(lines))
library(XML)
get.xml <- function(i) {
txt <- paste(lines[start[i]:end[i]],collapse="\n")
# print(i)
xmlTreeParse(txt,asText=T)
# return(i)
}
docs <- lapply(1:5,get.xml)
class(docs[[1]])
代码解析谷歌专利中的XML文件(文件为here),似乎有效,我可以选择性地选择个别专利,但是,当我提交以下内容时:
sapply(docs, function(doc) xmlValue(doc["//invention-title"][[1]]))
[1] NA NA NA NA NA
它不会像答案中那样返回发明标题的列表,而是给我五个NA。任何帮助将不胜感激。
如果我提供以下命令:
docs[[2]]
它在列表中输出专利第二的全部内容。我想要提取的相关信息显示为:
<invention-title id="d2e73">Dress/coat</invention-title>
将“连衣裙/外套”显示为五个NA之一
答案 0 :(得分:0)
我认为问题在于Google提供的文件。 &#34; xml&#34; zip文件中的文件不是有效的XML。如果您查看解压缩的文件,您将非常正确地看到它,从第1行的通常XML声明开始:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v44-2013-05-16.dtd" [ ]>
然后继续使用数据,从us-patent-grant
根元素开始,几百行内容,并在第593行关闭该元素:
<us-patent-grant lang="EN" dtd-version="v4.4 2013-05-16" file="USD0709266-20140722.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20140707" date-publ="20140722">
[a few hundred lines omitted]
</us-patent-grant>
如果那是文件的结尾,那么您就拥有格式良好的XML。但是,ipg140722.xml
文件实际上是一个接着连接的格式良好的XML文件的系列:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v44-2013-05-16.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.4 2013-05-16" file="USD0709266-20140722.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20140707" date-publ="20140722">
[a few hundred lines omitted]
</us-patent-grant>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v44-2013-05-16.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.4 2013-05-16" file="USD0709267-20140722.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20140707" date-publ="20140722">
[a few hundred lines omitted]
</us-patent-grant>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v44-2013-05-16.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.4 2013-05-16" file="USD0709268-20140722.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20140707" date-publ="20140722">
[a few hundred lines omitted]
</us-patent-grant>
(etc)
结果串联是不是格式良好的XML,大概就是为什么R会窒息。
如果你看,你会在594,1041,1555等行上看到一个新的XML声明,直到文件到最后。如果将行1-593,594-1040或1041-1554粘贴到XML语法检查器(例如http://www.w3schools.com/xml/xml_validator.asp处的行),它将报告&#34;未发现错误。&#34;
但是尝试,例如,所有这些行,第1-1554行,你将得到一个XML解析错误,&#34;文件元素&#34;之后的垃圾。
您需要找到一些方法将您需要的部分拆分为格式良好的XML文件,以便将其作为XML进行处理。