首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R在xml中编辑或添加文本

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

Stack Overflow用户
提问于 2020-10-09 20:20:30
回答 2查看 220关注 0票数 2

我有一个很大的xml文档(超过3.000行)。背景:我的测量软件允许导出为xml文件。为了节省一些工作,我想自动将问题翻译成不同的语言(19!)然后将它们添加到这个xml中。在下面的例子中是一个德语的问题和英语和波斯语的翻译。我想要实现什么:插入一个子级并将其与新的子级一起保存。

代码语言:javascript
运行
复制
<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(),但我不知道如何更改现有文本或添加新的子项?

此外,我还必须找到问题。在这个例子中,问题块的位置是"5“。我想使用管道或循环一个接一个地处理问题并添加翻译。然后,我可以将完成的XML重新导入到软件中。

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

EN

回答 2

Stack Overflow用户

发布于 2020-10-19 01:21:42

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

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

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

代码语言:javascript
运行
复制
<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 (使用循环演示)

代码语言:javascript
运行
复制
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")

输入(无LANGENTRY节点)

代码语言:javascript
运行
复制
<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>

输出(新的LANGENTRY节点)

代码语言:javascript
运行
复制
<?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>
票数 3
EN

Stack Overflow用户

发布于 2020-10-20 05:11:31

我会这样做,但是HTML实体有一个问题,我不知道为什么要替换它们。

代码语言:javascript
运行
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64279943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档