Удалить CDATA из XML с помощью регулярных выражений в Windows CMD (powershell) - PullRequest
0 голосов
/ 26 июня 2019

Я работаю с некоторыми данными XML, и я пытаюсь удалить CDATA в XML. Я пробовал много способов, и кажется, что проще - заменить все шаблоны

hey <![CDATA[mate - number 1]]> what's up

по

hey mate - number 1 what's up

Regex, чтобы получить полное выражение (\<\!\[CDATA\[)(.*)(\]\]\>), поэтому при использовании PERL (PCRE) мне просто нужно заменить на \2.

Таким образом, используя Powershell, я запускаю CMD:

powershell -Command "(gc Desktop\test_in.xml) -replace '(\<\!\[CDATA\[)(.*)(\]\]\>)', '\2' | Out-File Desktop\test_out.xml")

Хотя результат всегда заменяется строкой \2 вместо mate - number 1 в примере.

Вместо \2 я попытался (?<=(\<\!\[CDATA\[))(.*?)(?=(\]\]\>)), так как я получаю с этим внутреннюю часть, которую я пытаюсь сохранить, хотя результат разочаровывает, снова буквальная замена.

Есть предположения?

Спасибо!

PS. Если кто-нибудь знает, как избежать этой замены в R, это также полезно.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Переменные Powershell составляют $ 1 $ 2 и т. Д., В powershell вы всегда используете переменные вместо традиционной # нотации, реализованной в большинстве языков.

Сейчас я нахожусь на мобильном телефоне или хотел бы проверить, чтобы меня отключили, но я считаю, что это сделает необходимое:

 powershell -Command "(gc Desktop\test_in.xml) -replace '(\<\!\[CDATA\[)(.*)(\]\]\>)', "$2" | Out-File Desktop\test_out.xml")

Вы также можете создавать именованные группы захвата, если хотите:

 powershell -Command "(gc Desktop\test_in.xml) -replace '(\<\!\[CDATA\[)(?<CData>.*)(\]\]\>)', "${CData}" | Out-File Desktop\test_out.xml")
0 голосов
/ 26 июня 2019

Любой XSLT, который запускает Identity Transform (т.е. копирует себя), удалит теги <CData>.Рассмотрите возможность работы с пакетом R xslt или с PowerShell:

library(xml2)
library(xslt)

txt <- "<root>
              <data>hey <![CDATA[mate - number 1]]> what's up</data>
       </root>"    
doc <- read_xml(txt)

txt <- '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output indent="yes"/>
            <xsl:strip-space elements="*"/>

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

         </xsl:stylesheet>'    
style <- read_xml(txt, package = "xslt")

new_xml <- xml_xslt(doc, style)

# Output
cat(as.character(new_xml))

# <?xml version="1.0" encoding="UTF-8"?>
# <root>
#    <data>hey mate - number 1 what's up</data>
# </root>

Powershell

$xslt = New-Object System.Xml.Xsl.XslCompiledTransform;

$xslt.Load("C:\Path\To\Identity_Transform\Script.xsl");
$xslt.Transform("C:\Path\To\Input.xml", "C:\Path\To\Output.xml");
...