Как я могу заменить текст с элементом в XmlDocument - PullRequest
0 голосов
/ 07 октября 2018

У меня есть следующий xml:

<div>foo 123 <span id=123>bar</span> baz</div>

И я хотел бы обернуть 123 элементом a:

<div>foo <a>123</a> <span id=123>bar</span> baz</div>

Что я пробовал?

1) Я не могу выполнить замену InnerXml элемента div, например:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

var xmlElement = xmlDocument.DocumentElement;
xmlElement.InnerXml = xmlElement.InnerXml.Replace("123", "<a>123</a>");

Это приведет к неверному xml:

System.Xml.XmlException:'<', шестнадцатеричное значение 0x3C, является недопустимым символом атрибута.Строка 1, позиция 26. </p>

2) Также это не позволяет мне заменить InnerXml 1-го узла внутри элемента div, например:

var childNode = xmlDocument.ChildNodes[0].ChildNodes[0];
childNode.InnerXml = childNode.InnerXml.Replace("123", "<a>123</a>");

Потому что:

System.InvalidOperationException: Невозможно установить 'InnerXml' для текущего узла, поскольку он доступен только для чтения или не может иметь дочерних элементов.

3) Возможно, я мог бы изменить 1-й текстовый узел наизбавиться от "123", вставить новый элемент с 123 после текстового узла.и вставьте новый текстовый узел после элемента с 123 (с оставшимся пробелом).Однако это не позволяет мне создавать новый экземпляр XmlText.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Это не идеальное решение, но вы можете заменить текст "123" на регулярное выражение:

            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

            var xmlElement = xmlDocument.DocumentElement;
            xmlElement.InnerXml = Regex.Replace(xmlElement.InnerXml, "([^\"]123[^\"])", " <a>123</a>");
0 голосов
/ 07 октября 2018

Вы можете попробовать этот код.Но помните, что этот код все еще нуждается в некоторой работе для защиты от исключений:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

// get first child and the ID from second child
var firstChild = xmlDocument.FirstChild.FirstChild;
var id = firstChild.NextSibling.Attributes[0].Value;

// remove the ID from the text
firstChild.Value = firstChild.Value.Replace(id, "");

// create the node and set it's inner text to ID
var node = xmlDocument.CreateNode("element", "a", "");
node.InnerText = id;

// append created element to XML
xmlDocument.FirstChild.InsertAfter(node, firstChild);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...