Member 12692000 Ответов: 1

Как проверить наличие несбалансированного набора скобок внутри узла?


Как проверить наличие любого несбалансированного набора скобок внутри узла, например, с помощью LINQ-to-XML
<?xml version="1.0"?>
    <root>
    	<child1>Anything goes <a>(here</a>) and <bb>(there)</bb>!</child1>
    	<child2>Whatever <a>goes (around)</a> <bb>comes around()</bb> and (<a>that is)</a> a fact.</child1>
    </root>

В приведенном выше примере xml узел <a>(here</a> содержит только открывающие скобки внутри узла, а закрывающие скобки находятся вне узла, в этом случае я хочу переставить эти открывающие скобки непосредственно перед узлом. <a> узел как (<a>here</a>) и та же логика для любого узла вроде (<a>that is)</a> следует заменить следующим образом (<a>that is</a>) и <a>goes (around)</a> однако он должен оставаться неизменным, поскольку содержит полный набор открывающих и закрывающих скобок <bb>(there)</bb> также следует изменить на (<bb>there</bb>) поскольку и открывающие, и закрывающие скобки расположены непосредственно после и перед узлами.
Кто-нибудь может помочь!!

Что я уже пробовал:

Честно говоря, я понятия не имею, как это сделать
XDocument xml = XDocument.Load(@"D:\test.xml");
var targetnodes=from x in xml.Descendants("a")
                where ????

Кроме того, вот некоторые другие типы для лучшего понимания
<bb>(statistical moments of the 1(st) - 4(th) (order))</bb>
(<bb>statistical moments of the 1(st) - 4(th) (order))</bb>
<bb>(statistical moments of the 1(st) - 4(th) (order)</bb>)
<bb>((statistical moments) of the 1(st) - 4(th) (order)</bb>)
должно быть
(<bb>statistical moments of the 1(st) - 4(th) (order)</bb>)
(<bb>statistical moments of the 1(st) - 4(th) (order)</bb>)
(<bb>statistical moments of the 1(st) - 4(th) (order)</bb>)
(<bb>(statistical moments) of the 1(st) - 4(th) (order)</bb>)

1 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Одна стратегия, которую я использовал некоторое время назад для подобных вещей:

Вам нужно выталкивать/выталкивать вещи из стека - на самом деле, возможно, более одного стека.

Для элементов: вы нажимаете имя элемента в стеке. Когда появляется закрывающий элемент, сравните его с верхней частью стека, и он должен совпадать (а если это так, то поп его).
Это необходимо для того, чтобы обрезка происходила внутри элемента.

Теперь, что касается скобок: они, как и фигурные скобки и т. д., должны встречаться попарно между элементами (push/pop выше). Если вы используете один и тот же стек, всякий раз, когда вы сталкиваетесь с пареном, сравните его с верхним элементом. Если вы только что получили закрывающий паренек, то верхний элемент должен быть открывающим паренком. Если нет, подтолкните нового парена (они гнездятся). В конце концов, вы достигнете заключительного элемента, и там не должно быть никакого парена. Тот же Тест, что и в пункте выше.



Member 12692000

Не могли бы вы показать какой-нибудь код?

W∴ Balboos, GHB

Google - ваш друг (C# stacks)
https://www.dotnetperls.com/stack - например

Есть несколько основных команд push, pop, peek -
Вам нужно сделать сравнение, основанное на любом типе, который вы пытаетесь сравнить. В вашем случае тип, который вы, скорее всего, используете, - это строка, и в зависимости от вашего источника вы можете сделать сравнение чувствительным к регистру или нет (сгенерированное человеком или машиной).

Стеки - это действительно мощные и важные инструменты, необходимые для парсера, который вы создаете.

Вы нажимаете "открытие" элементов, будь то теги, скобки, кавычки, что угодно. Для таких вещей, как теги или закрывающие скобки, взгляните на верхний элемент в стеке, которому он должен соответствовать, если вещи должны закрываться в открытом порядке. Если он совпадает, вытащите его из стека (он закрыт и, следовательно, завершен). Если он не совпадает - вы нашли свою проблему.