C # регулярное выражение для удаления значения, заключенного в элемент XML - PullRequest
0 голосов
/ 04 февраля 2019

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

string xml = "<MyElement1 attribute="bla"><MyElement1>12345</MyElement1></MyElement1>"

Я хочу знать, как сделать следующее:

  • совпадение на MyElement1 узлах, которые не имеют атрибута

Таким образом, используя мой пример, я бы сопоставил <MyElement1>12345</MyElement1> и заменил <MyElement1> и </MyElement1>, чтобы мой последний узел выглядел так: <MyElement1 attribute="bla">12345</MyElement1>

Я пробовал: [<][^>]*[>], ноэто соответствует на всех элементах.Я не уверен, как указать конкретные элементы, с которыми я хочу сопоставить.

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Ну, на самом деле вам не нужно использовать регулярные выражения, вам просто нужно проанализировать ваш XML с помощью анализатора XML.

Один из вариантов, который у вас есть, - использовать XDocument.Parse( xml ) метод и XElement, где первый будет для анализа строки, а второй для чтения ее тега и его значения.Примером для чтения может быть следующий

string xml = "<MyElement1>12345</MyElement1><MyElement2>abcd</MyElement2><MyElement3>12345</MyElement3><MyElement4>12345</MyElement4>";
// wrap your element in a rootnode (you seem to be missing one in your example)
var document = XDocument.Parse( $"<root>{xml}</root>");
// get the root node and loop over it's children (cast XNode to XElement in the process)
foreach (var node in document.Root.Nodes().OfType<XElement>()) {
  // name is tag, value is well, it's value
  Console.WriteLine($"{node.Name}: {node.Value}");
}

Обратите внимание, что для правильного разбора документа необходимо добавить корневой узел, так как у xml может быть только один корневой узел в документе.В моем примере я вложил корневой узел во время синтаксического анализа

В этом примере кода используется пространство имен System.Xml.Linq, поэтому не забудьте импортировать его.

Еще один комментарий будет заключаться в том, что вашв предоставленном XML-коде была ошибка (MyElemen4 открывающий тег с MyElement4 закрывающий тег)

0 голосов
/ 04 февраля 2019

Я бы порекомендовал использовать синтаксический анализатор XML, но если вы хотите, вы можете использовать простое регулярное выражение, например <([\w]*)>(.*?)<\/[\w]*>, это вернет имя тега и значение внутри.

Вывод:

Match 1
Full match  0-30    <MyElement1>12345</MyElement1>
Group 1.    1-11    MyElement1
Group 2.    12-17   12345
Match 2
Full match  30-59   <MyElement2>abcd</MyElement2>
Group 1.    31-41   MyElement2
Group 2.    42-46   abcd
Match 3
Full match  59-89   <MyElement3>12345</MyElement3>
Group 1.    60-70   MyElement3
Group 2.    71-76   12345
Match 4
Full match  89-118  <MyElemen4>12345</MyElement4>
Group 1.    90-99   MyElemen4
Group 2.    100-105 12345

Имейте в виду, что это не учитывает атрибуты тега.Если вы хотите получить определенный тег, вы можете заменить [\w] на имя нужного тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...