【问题标题】:How to get XML nodes InnerText without concatenation and using Xml.Linq in C#?如何在没有连接的情况下获取 XML 节点 InnerText 并在 C# 中使用 Xml.Linq?
【发布时间】:2020-04-25 06:34:47
【问题描述】:

我已经检查了 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>

我正在尝试读取&lt;cmd name="cat"&gt; 的子节点&lt;code&gt;,您可以看到它包含几行。

我的实际代码是:

            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)被剥离。我需要按原样获取文本,不进行任何连接或重新格式化,但不知道如何实现。

我尝试了多个选项,但找不到解决方案。

谢谢。

【问题讨论】:

    标签: c# xml linq-to-xml xelement


    【解决方案1】:

    我认为这可能与您将文本放入的对象(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;
            }
    

    【讨论】:

    • 现在,您可以尝试将该字符串添加到文本框并告诉我结果。您会看到没有保留换行符。
    • 我认为我们确定这就是问题所在。您使用的对象不支持换行符。这很可能是一个文本字段。您需要找到一个支持多行文本的对象。从本质上讲,您似乎正在尝试以不受支持的方式使用本机 C# 对象
    • 你没有解决问题,你只是忽略了我之前的话,我要求你应该测试将该字符串(带换行符)添加到具有多行支持的文本框中,你会自己看到。我使用的对象支持换行符,因为它是一个多行文本框。
    • 我并不是要不屑一顾,我只是说您的问题与 XML 或 Linq 无关。问题是您试图将多行字符串放入您声称应该支持它的对象中,但这不起作用。我认为此时您应该做的是打开一个新问题,因为您提出的问题已回答“如何在不连接的情况下获取 XML 节点 InnerText”。此时您的问题有所不同,“为什么我不能将多行文本字符串放入文本框中”。
    • 请查看我编辑的答案,它提供了一个示例,说明如何将换行符替换为适用于您的多行文本框的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多