Сопоставить теги из строки, которые удовлетворяют условию другого тега - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть следующая строка:

string input = @"
            <ROOT>
              <INFO>
                <BASEINFO>
                  <CODE>113774629994</CODE>
                  <FOUNDERS_LIST_1>
                    <COMPANIES>
                      <CAPITAL_SHARE_PCT>29.000000000000000</CAPITAL_SHARE_PCT>
                      <COMPANY_CODE>1111</COMPANY_CODE>
                    </COMPANIES>
                    <COMPANIES>
                      <CAPITAL_SHARE_PCT>29.000000000000000</CAPITAL_SHARE_PCT>
                      <COMPANY_CODE>2222</COMPANY_CODE>
                    </COMPANIES>
                  </FOUNDERS_LIST_1>
                  <FOUNDERS_LIST_2>
                    <PERSONS>
                      <CAPITAL_SHARE_PCT>1.000000000000000</CAPITAL_SHARE_PCT>
                      <PERSONS_CODE>3333</PERSONS_CODE>
                    </PERSONS>
                    <PERSONS>
                      <CAPITAL_SHARE_PCT>41.000000000000000</CAPITAL_SHARE_PCT>
                      <PERSONS_CODE>4444</PERSONS_CODE>
                    </PERSONS>
                  </FOUNDERS_LIST_2>
                </BASEINFO>
              </INFO>
            </ROOT>";

Мне нужно извлечь все коды (COMPANY_CODE s и PERSONS_CODE s), где CAPITAL_SHARE_PCT больше некоторого значения.

Скажем, CAPITAL_SHARE_PCT должно быть больше 25. Тогда результаты должны быть:

1111
2222
4444

Я могу добиться этого, создав классы с атрибутами XmlElement, а затем десертируем эту строку в некоторую модель.

Есть ли способ достичь этого с помощью регулярных выражений?И достаточно ли в этом случае использовать регулярные выражения?

1 Ответ

0 голосов
/ 20 сентября 2019

Хорошо, я пришел к этому решению:

decimal threshold = 25.0m;
List<string> ret = new List<string>();

char tab = '\u0009';
input = input.Replace(tab.ToString(), string.Empty)
            .Replace(" ", string.Empty)
            .Replace("\r\n", string.Empty);

// COMPANIES
Regex regex = new Regex("<COMPANIES>(.*?)</COMPANIES>");
var companies = regex.Matches(input)
            .Cast<Match>()
            .Select(m => m.Groups[1].ToString());

foreach (var a in companies)
{
    regex = new Regex("<CAPITAL_SHARE_PCT>(.*)</CAPITAL_SHARE_PCT>");
    var pct = regex.Match(a).Groups[1].ToString();

    if (Convert.ToDecimal(pct.Replace(".", ",")) > threshold)
    {
        regex = new Regex("<COMPANY_CODE>(.*)</COMPANY_CODE>");
        var code = regex.Match(a).Groups[1].ToString();
        ret.Add(code);
    }
}

// PERSONS
regex = new Regex("<PERSONS>(.*?)</PERSONS>");
var persons = regex.Matches(input)
            .Cast<Match>()
            .Select(m => m.Groups[1].ToString());

foreach (var a in persons)
{
    regex = new Regex("<CAPITAL_SHARE_PCT>(.*)</CAPITAL_SHARE_PCT>");
    var pct = regex.Match(a).Groups[1].ToString();

    if (Convert.ToDecimal(pct.Replace(".", ",")) > threshold)
    {
        regex = new Regex("<PERSONS_CODE>(.*)</PERSONS_CODE>");
        var code = regex.Match(a).Groups[1].ToString();
        ret.Add(code);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...