如何在R中删除XML文件中注释中多次出现的符号,删除该符号并用原始名称将其保存回XML?

如何在R中删除XML文件中注释中多次出现的符号,删除该符号并用原始名称将其保存回XML?,r,xml,xslt,xml-parsing,R,Xml,Xslt,Xml Parsing,我需要删除R中XML文件注释中出现的几个符号(单引号),然后将其保存回XML。我必须在1000个XML文件中完成这项工作 在每个XML文件中,单个引号出现了50多次,并以不同的子层次结构出现(有些在子级中,有些在子级中)。但总是出现在评论中 我尝试在R中使用XML包。我首先尝试启用这一个XML文件,但不知道如何继续 library(XML);library(xml2);library(methods);library(tidyverse) #Read one XML file filep

我需要删除R中XML文件注释中出现的几个符号(单引号),然后将其保存回XML。我必须在1000个XML文件中完成这项工作

在每个XML文件中,单个引号出现了50多次,并以不同的子层次结构出现(有些在子级中,有些在子级中)。但总是出现在评论中

我尝试在R中使用XML包。我首先尝试启用这一个XML文件,但不知道如何继续

    library(XML);library(xml2);library(methods);library(tidyverse)
#Read one XML file
filepath <- "C:/Users/PeriaPr/Desktop/repex1.xml"
onefile <- xmlTreeParse(gsub("'","",readLines(filepath)),asText = TRUE)
xmlroot <- xmlRoot(onefile)
var <- xmlSApply(xmlroot, function(x) xmlSApply(x, xmlValue))
库(XML);图书馆(xml2);图书馆(方法);图书馆(tidyverse)
#读取一个XML文件
文件路径
2.
68

要删除title元素内容中的所有单引号,可以使用以下XSLT 3.0样式表:

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="title/text()">{translate(.,"'","")}</xsl:template>
</xsl:transform>

{翻译(,“,”,“)}
如果希望保留CDATA标记(XSLT认为这是纯噪声),请添加一个带有
CDATA节元素的
xsl:output
声明


要将此转换应用于许多源XML文件,您可以(a)使用Saxon的功能从命令行处理目录中的所有文件,(b)将控制逻辑放在XSLT样式表中(使用collection()函数),或者(c)使用一些外部控制逻辑,例如XProc、Ant、,或者一个shell脚本。

您已经标记了问题“R”和“XSLT”,但您的问题只提到了“R”。XSLT解决方案可以接受吗?您的问题涉及“注释”,但XML中没有注释。您是指CDATA区域吗?@MichaelKay感谢您的快速回复。非常感谢。我喜欢使用XML包来实现这一点,因为在XML包中循环到多个文件非常容易。但我肯定会尝试您建议的XSLT方法。是的,我的意思是说CDATA部分,而不是评论。删除引号后,我需要保留CDATA标记。@MichaelKay:尝试过。看到一些错误。我对XSLT和XML世界都是全新的。在这里粘贴我的代码和XSL文件以及错误消息。你能看到我错过了什么吗
#使用XSLT doc@MichaelKay错误消息我看到:doc中的错误XSLT_apply(doc$doc,stylesheet$doc,paramstr):XSLT错误:编译错误:file/Desktop/repex1xsl.xsl第2行元素mod.尝试过但看到错误。在我的帖子的评论部分提供了详细信息。我强烈怀疑您使用的XSLT处理器不支持XSLT 3.0。为了简洁起见,我在解决方案中使用了XSLT 3.0,但是如果您准备编写20行代码而不是4行代码,那么在XSLT 1.0中就可以很容易地完成。但是XSLT1.0已经很老了,我已经不习惯了。
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="title/text()">{translate(.,"'","")}</xsl:template>
</xsl:transform>