重新生成Google专利的XML解析

时间:2015-05-15 14:44:14

标签: xml r

我正在关注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之一

1 个答案:

答案 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进行处理。