Как получить XML узлов InnerText без объединения и использования Xml .Linq в C#? - PullRequest
1 голос
/ 07 января 2020

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

У меня есть следующий XML файл на диске (commands.xml) со следующими содержание:

<?xml version="1.0" encoding="utf-8"?>
<categories>
  <category name="Standard">
    <cmd name="pwd">
      <description>Get working dir.</description>
      <code>echo getcwd();</code>
    </cmd>
    <cmd name="cat">
      <description>Reads a file.</description>
      <code>$fh = fopen("&lt;&lt;cmd&gt;&gt;", 'r') or die ("Cant open file");
$lines = fread($fh, filesize("&lt;&lt;cmd&gt;&gt;"));
echo "$lines";
fclose($fh);</code>
    </cmd>
    </category>
</categories>

Я пытаюсь прочитать дочерний узел <code> из <cmd name="cat">, поскольку, как вы можете видеть, он содержит несколько строк.

Мой настоящий код:

            var xml = XElement.Load("commands.xml");
            var query = xml.Descendants()
                .Where(x => x.Name == "category" && x.Attribute("name").Value == "Standard")
                .Descendants()
                .Where(x => x.Name == "cmd" && x.Attribute("name").Value == "cat");

            var first_query_result = query.FirstOrDefault();
            if (first_query_result != null)
            {
                textBox_cmd_code_editor.Text = first_query_result.Descendants("code").Single().Value;
            }

Проблема в том, что текст объединяется, а переходы строки (\r\n) удаляются. Мне нужно получить текст как есть, без какой-либо конкатенации или переформатирования, но я не знаю, как этого добиться.

Я пробовал несколько вариантов, но не смог найти решение.

Спасибо .

1 Ответ

0 голосов
/ 07 января 2020

Я думаю, что это может иметь какое-то отношение к объекту, в который вы помещаете текст (textBox_cmd_code_editor.Text).

Я поместил ваш вывод в обычную строковую переменную, и переводы строки были сохранены.

Попробуйте поместить вывод в обычную строковую переменную, а затем манипулировать ею оттуда. Вероятно, ваш целевой объект просто не поддерживает переводы строк, т. Д.

Редактировать: вам нужно преобразовать переносы строк в Environment.NewLine следующим образом:

            string originalString;
        string convertedString;
        if (first_query_result != null)
        {
            originalString = first_query_result.Descendants("code").Single().Value;
            convertedString = Regex.Replace(originalString, @"\r\n?|\n", Environment.NewLine);
            textBox1.Text = convertedString;
        }
...