.Net, XML и Regex - Как сопоставить конкретный элемент коллекции? - PullRequest
0 голосов
/ 12 мая 2010

Итак, у меня есть XML-файл со следующим упрощенным содержимым XML-файла:

<CollectionItems>
    <CollectionItem>
        <Element1>Value1</Element1>
        <Element2>
            <SubElement1>SubValue1</SubElement1>
            <SubElement2>SubValue2</SubElement2>
            <SubElement3>SubValue3</SubElement3>
        </Element2>
        <Element3>Value3</Element3>
    </CollectionItem>
    <CollectionItem>
        <Element1>Value1</Element1>
        <Element2>
            <SubElement1>SubValue1</SubElement1>
            <SubElement2 />
            <SubElement3>SubValue3</SubElement3>
        </Element2>
        <Element3>Value3</Element3>
    </CollectionItem>
    <CollectionItem>
        <Element1>Value1</Element1>
        <Element2>
            <SubElement1>SubValue1</SubElement1>
            <SubElement2>SubValue2</SubElement2>
            <SubElement3>SubValue3</SubElement3>
        </Element2>
        <Element3>Value3</Element3>
    </CollectionItem>
</CollectionItems>

Я пытаюсь написать регулярное выражение в .Net, которое соответствует любому CollectionItem, где SubElement2 пуст (средний CollectionItem в этом примере).

Пока у меня есть следующее регулярное выражение (режим SingleLine включен):

<CollectionItem>.+?<SubElement2 />.+?</CollectionItem>

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

Редактировать: Почему регулярное выражение в отличие от чего-то другого:

  1. Я пытался изменить файл в текстовом редакторе для простоты.
  2. После того, как я не смог понять, как это сделать в регулярных выражениях, я захотел узнать, можно ли это сделать (и как) ради обучения.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 мая 2010

Почему вы пытаетесь использовать регулярное выражение? У вас есть совершенно хорошая модель предметной области (XML) - почему бы не поискать ее? Так, например, в LINQ to XML:

var collectionsWithEmptySubElement2 =
       document.Descendants("SubElement2")
               .Where(x => x.IsEmpty)
               .Select(x => x.Ancestors("CollectionItem").FirstOrDefault());

или

var collectionsWithEmptySubElement2 =
       document.Descendants("CollectionItem")
               .Where(x => x.Descendants("SubElement2").Any(sub => sub.IsEmpty));
3 голосов
/ 12 мая 2010

Это XML - почему вы пытаетесь сделать это с помощью Regex? Разве XPath не имеет больше смысла?

2 голосов
/ 13 мая 2010

Вы можете использовать

<CollectionItem>((?!<CollectionItem>).)+?<SubElement2 />.+?</CollectionItem>

Это гарантирует, что дальнейший <CollectionItem> не окажется между начальным тегом и тегом <SubElement2 />.

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