使用R编辑或添加xml中的文本



我有一个很大的xml文档(超过3.000行(。背景:我的调查软件允许导出为xml文件。为了节省一些工作,我想将问题自动翻译成不同的语言(19!(,然后将它们添加到这个xml中。下面的例子中有一个德语问题,以及英语和波斯语的翻译。我想要实现什么:插入子项<LANGENTRY LANG=";en";VALUE=ru";文本文本文本"/>并将xml与新的子项一起保存。

<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false"/>
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<META KEY="METAKEY_VALIDATION_RULE" VALUE=""/>
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false"/>
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem 
Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VALUE="[b]5. Since when do you live in Germany, Leipzig or the residential area 
you are living at the moment? Please enter the year. "/>
<LANGENTRY LANG="fa" VALUE="&#x200c;&#x640;  &#x627;&#x632; &#x686;&#x647; 
&#x632;&#x645;&#x627;&#x646;&#x6cc; &#x62a;&#x627;&#x6a9;&#x646;&#x648;&#x646; &#x62f;&#x631; 
&#x622;&#x644;&#x645;&#x627;&#x646; &#x628;&#x62a;&#x631;&#x62a;&#x6cc;&#x628; &#x62f;&#x631; 
&#x644;&#x627;&#x6cc;&#x67e;&#x632;&#x6cc;&#x6af; &#x6cc;&#x627; &#x645;&#x646;&#x637;&#x642;&#x647; 
&#x645;&#x633;&#x6a9;&#x648;&#x646;&#x6cc; &#x62e;&#x648;&#x62f; &#x632;&#x646;&#x62f;&#x6af;&#x6cc; 
&#x645;&#x6cc; &#x6a9;&#x646;&#x6cc;&#x62f;&#x61f;"/>
</INTLVAL>
</EXPLANATION>

这是我尝试过的:xml_find_all(xml, xpath = "//LANGENTRY/@VALUE")%>%xml_text(),但我不知道如何更改现有文本或添加新的子项?

此外,我还必须找到问题。在该示例中,它是questionblock place";5〃;。我想用管道或循环一个接一个地处理问题,并添加翻译。然后我可以将完成的XML导入回软件中。

我希望这在某种程度上是清楚的;(

考虑XSLT,这是一种专门用于转换XML文件的语言,您可以在R和样式表之间传递参数(语言类型和翻译文本(进行转换。您可以使用xslt包(xml2)的姊妹包(运行XSLT1.0脚本。请注意:XSLT是一种行业语言,因此可以移植到其他语言(Java、Python、PHP(和具有参数接口的可执行文件。

具体来说,运行Identity Transform模板,按原样复制XML,然后在搜索原始文本后,有条件地将参数绑定到INTLVAL节点下的新LANGENTRY节点。

XSLT (另存为.xsl文件,一个特殊的.xml文件(

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- INITIALIZE PARAMS -->
<xsl:param name="orig_text"/>
<xsl:param name="trans_lang"/>
<xsl:param name="trans_text"/>

<!-- IDENTITY TRANSFORM -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<!-- ADD LANGENTRY NODES WITH BINDED PARAM VALUES -->
<xsl:template match="INTLVAL">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:if test = "ancestor::EXPLANATION[@NAME = $orig_text]">
<LANGENTRY LANG="{$trans_lang}" VAL="{$trans_text}"/>
</xsl:if>      
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

R(用循环演示(

library(xml2)
library(xslt)
# READ XML AND XSLT
doc <- read_xml("Input.xml", package = "xslt")
style <- read_xml("Script.xsl", package = "xslt")
# TRANSLATION DATA
translations <- list(
list(orig = c("de", "[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem  Wohngebiet? Bitte tragen Sie das Jahr ein."),
other = c("en", "[b]5. Since when do you live in Germany, Leipzig or the residential area  you are living at the moment? Please enter the year. ")),
list(orig = c("de", "[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem  Wohngebiet? Bitte tragen Sie das Jahr ein."),
oth = c("fa", "ـ  از چه  زمانی تاکنون در  آلمان بترتیب در  لایپزیگ یا منطقه  مسکونی خود زندگی  می کنید؟")),
list(orig = c("de", "Die Sanftmütigen werden die Erde erben"),
other = c("en", "The meek shall inherit the earth")),
list(orig = c("de", "Die Sanftmütigen werden die Erde erben"),
other = c("fr", "Les doux hériteront de la terre")),
list(orig = c("de", "Sein oder Nichtsein; das ist hier die Frage"),
other = c("en", "To be, or not to be: that is the question")),
list(orig = c("de", "Sein oder Nichtsein; das ist hier die Frage"),
oth = c("es", "¡Ser, o no ser, es la cuestión!"))
)          

# LOOP THROUGH TRANSLATIONS AND PASS IN PARAMS FOR TRANSFORMATION
for (t in translations) {
doc <- xml_xslt(doc, style, 
params=list(orig_text = t$orig[2],  # LIST NAME MUST MATCH XSLT PARAM
trans_lang = t$oth[1],  # LIST NAME MUST MATCH XSLT PARAM
trans_text = t$oth[2])  # LIST NAME MUST MATCH XSLT PARAM
)
}

# SAVE EDITED DOC TO FILE           
output <- write_xml(doc, "Output.xml")

输入XML(无LANGENTRY节点(

<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false" />
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<META KEY="METAKEY_VALIDATION_RULE" VALUE="" />
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false" />
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem  Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Die Sanftmütigen werden die Erde erben">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Sein oder Nichtsein; das ist hier die Frage">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
</QUESTIONBLOCK>

输出XML(新LANGENTRY节点(

<?xml version="1.0" encoding="UTF-8"?>
<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false"/>
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<META KEY="METAKEY_VALIDATION_RULE" VALUE=""/>
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false"/>
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem  Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="[b]5. Since when do you live in Germany, Leipzig or the residential area  you are living at the moment? Please enter the year. "/>
<LANGENTRY LANG="fa" VAL="ٜـ  از چه  زمانی تاکنون در  آلمان بترتیب در  لایپزیگ یا منطقه  مسکونی خود زندگی  می کنید؟"/>
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Die Sanftmütigen werden die Erde erben">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="The meek shall inherit the earth"/>
<LANGENTRY LANG="fr" VAL="Les doux hériteront de la terre"/>
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Sein oder Nichtsein; das ist hier die Frage">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="To be, or not to be: that is the question"/>
<LANGENTRY LANG="es" VAL="¡Ser, o no ser, es la cuestión!"/>
</INTLVAL>
</EXPLANATION>
</QUESTIONBLOCK>

我会做如下操作,但HTML实体存在问题,我不知道为什么要替换它们。

library(xml2)
xml <- read_xml("waschi.xml")
x <- xml_new_root("LANGENTRY")
langentry <- xml_find_first(x, "//LANGENTRY")
xml_set_attr(langentry, "LANG", "ru")
xml_set_attr(langentry, "VALUE", "text text text")
intlval <- xml_find_first(xml, "//INTLVAL")
xml_add_child(intlval, langentry)
write_xml(xml, "waschi_new.xml")

最新更新