Я ищу способ удалить начальные и конечные пробелы из значения узла XML. Учитывая следующий базовый пример:

<CAR>
  <MAKE>   Ford   </MAKE>
  <COLOR>   Yellow  </COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>

Мне нужно получить следующий результат:

<CAR>
<MAKE>Ford</MAKE>
  <COLOR>Yellow</COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>

Мне удалось все это сделать, последовательно применив следующие два регулярных выражения:

>\s*[^a-zA-Z0-9^<]*

[^a-zA-Z0-9^>]*\s*</

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

Итак, может ли кто-нибудь помочь мне с получением выражения, которое успешно удаляет начальные и конечные пробелы из значений, оставляя при этом любые комментарии нетронутыми?

Надеюсь, я ясно выразился. Заранее спасибо!

0
Zettel 15 Фев 2016 в 11:57

3 ответа

Лучший ответ

Я не вижу здесь необходимости в регулярных выражениях, более того, вам в любом случае нужно будет перебирать ваши xml-узлы, так почему бы просто не перебрать значения ваших узлов и не выполнить для них .Trim()?

Например:

    var xml = XDocument.Load("D:/myXml.xml");

    foreach (var node in xml.Root.Elements())
    {
        foreach (var child in node.Elements())
        {
            Console.WriteLine(string.Format("[{0}]", child.Value.Trim()));
        }
    }

Мой образец xml файла:

enter image description here

Результат: (я заключил его в [], чтобы вы могли видеть, что пробелы исчезли)

enter image description here

0
Veverke 15 Фев 2016 в 09:59

Если вы не против не использовать Regex, то это работает:

    var doc = XDocument.Parse(@"<CAR>
  <MAKE>   Ford   </MAKE>
  <COLOR>   Yellow  </COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>");

foreach (var xe in doc.DescendantNodes()
    .Where(n => n.NodeType == XmlNodeType.Text)
    .Select(x => x.Parent)
    .ToArray())
{
    xe.Value = xe.Value.Trim();
}

Он обновляет doc и дает мне следующее:

<CAR>
  <MAKE>Ford</MAKE>
  <COLOR>Yellow</COLOR>
  <!--<YEAR>  1987   </YEAR>-->
</CAR>
0
Enigmativity 15 Фев 2016 в 13:00

Попробуй это

Regex.Replace(input string, @"(([^\s]+)\s+)", "$2");

0
Chris Stillwell 21 Дек 2017 в 21:21