заменить указанный c текст в XML (KML) файле в r - PullRequest
0 голосов
/ 31 марта 2020

У меня есть несколько KML, которые содержат следующий узел:

<description><![CDATA[<img src="image_23037733.png" height="400" width="1200" align ="middle" />]]></description>

Я хотел бы изменить все вхождения текста " image _" на " path / on / другой / HDD / image_ ». Как отредактировать следующий код для выполнения sh задачи?

library(XML)

doc <- xmlTreeParse("File.kml", useInternal = TRUE)
nodes <- getNodeSet(doc, "description")
lapply(nodes, function(n) {
  xmlValue(n) <- gsub("image_","path/on/another/hdd/image_",xmlValue(n))
})


Error in `xmlValue<-`(`*tmp*`, value = "<img src=\"path/on/another/hdd/image_1.png\" height=\"400\" width=\"1200\" align =\"middle\" />") : 
  Cannot set the content of a node that is not an XMLInternalTextNode or a node containing a text node

1 Ответ

0 голосов
/ 31 марта 2020

Использование Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            string input = "<root><description><![CDATA[<img src=\"image_23037733.png\" height=\"400\" width=\"1200\" align =\"middle\" />]]></description></root>";
            XDocument doc = XDocument.Parse(input);

            List<XCData> cdata = doc.DescendantNodes().Where(x => x.NodeType == XmlNodeType.CDATA).Select(x => (XCData)x).ToList();
            foreach (XCData c in cdata)
            {
                string text = c.ToString();
                text = text.Replace("image_", "path/on/another/hdd/image_");
                c.ReplaceWith(text);

            }

        }
    }
}
...