Как удалить много вхождений символа в комментариях в файле XML в R, удалить символ и сохранить его обратно в XML с исходным именем? - PullRequest
1 голос
/ 17 января 2020

Мне нужно удалить несколько вхождений символа (одинарной кавычки) в комментариях в файле XML в R, а затем сохранить его обратно в XML. Я должен сделать это в тысячах XML файла.

В каждом файле XML одинарная кавычка встречается более 50 раз и представлена ​​в различной дочерней иерархической структуре (некоторые дочерние и некоторые дочерние). Но всегда присутствует в комментариях.

Я пытался использовать пакет XML в R. Сначала я попытался включить этот файл 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 файла. Одиночные кавычки (вокруг Orange, Apple и Banana) должны быть удалены в этой иерархической структуре с несколькими деревьями. Кавычки встречаются почти 50 раз в одном XML файле, и мне нужно обработать (удалить одиночные кавычки) 1000 с XML файлов

<?xml version = "1.0" encoding = "windows-1252"?><document id="myrepex.xml">
<action_step step_no="1.3.1.1">
    <step>1</step>
    <title><![CDATA[Part1 - 'Apple']]></title>
    <start><![CDATA[2019/08/09 7:57:17]]></start>
    <duration><![CDATA[0 Hr. 12 Min. 22 Sec.]]></duration>
    <status><![CDATA[Passed]]></status>
</action_step>
<action_step step_no="1.4.1.1">
    <step>2</step>
    <title><![CDATA[Part2 - 'Orange']]></title>
    <start><![CDATA[2019/08/09 8:09:39]]></start>
    <duration><![CDATA[0 Hr. 32 Min. 55 Sec.]]></duration>
    <status><![CDATA[Passed]]></status>
</action_step>  
<action_step step_no="1.5.1.1">
    <step>68</step>
    <title><![CDATA[Part3 - 'Banana']]></title>
    <start><![CDATA[2019/08/09 8:42:35]]></start>
    <duration><![CDATA[0 Hr. 36 Min. 28 Sec.]]></duration>
    <status><![CDATA[Passed]]></status>
</action_step>
<action_step2 secondchild="secondchild">
    <action_step2subchild subchild="subchild">
        <title><![CDATA[Part3 - 'Banana']]></title>
    </action_step2subchild>
</action_step2> 

1 Ответ

2 голосов
/ 17 января 2020

Чтобы удалить все одинарные кавычки в содержании титровальных элементов, вы можете использовать следующую таблицу стилей 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 считает чистым шум), добавьте объявление xsl:output с атрибутом cdata-section-elements.

Чтобы применить это преобразование ко многим исходным XML файлам, вы можете (а) использовать способность Саксона для обработки всех файлов в каталоге из (b) поместите управляющие логи c в таблицу стилей XSLT (используя функцию collection ()) или (c) используйте некоторые внешние управляющие логи c, например XPro c, Ant, или сценарий оболочки.

...