【问题标题】:XAttribute maintain CRXAttribute 维护 CR
【发布时间】:2018-05-11 09:49:17
【问题描述】:

我有一个 KVP,其中包含我想要在 XAttribute 中的数据,如下所示;

var kvpAttribute = new KeyValuePair<string,string>("rsaKey", @"----RSAKEY----
AWEACAWE123213AWEAWECAWE!AWEAWE
AWEAWEAWEAWEAWEQEAWEAWHYTAWEAAA
----END RSA KEY ----");

(删除的实际密钥)

我正在尝试将其写入 XML 文件。读取此 XML 的程序要求将密钥格式化为文件中的原样(在行之间使用 CR),当使用写入此密钥时;

var element = new XElement("Blah");
var attribute = new XAttribute("key", kvpAttribute.Key);
var attribute2 = new XAttribute("value", kvpAttribute.Value);

然后使用 XDocument.Save(FolderPath, FileName) 保存 XDocument 我在我的 XML 中得到输出;

<add value="----RSAKEY---&#xD;&#xA;AWEACAWE123213AWEAWECAWE!AWEAWE&#xD;&#xA;AWEAWEAWEAWEAWEQEAWEAWHYTAWEAAA&#xD;&#xA;----END RSA KEY ----" key="rsaKey"/>

(再次删除实际密钥)

如您所见,CR 被替换为 CR/LF ( ; ;)。

有没有办法维护从 KVP 到 XML 文件本身的格式?

【问题讨论】:

  • 您的第一段代码无法编译,因为它不是逐字字符串文字。如果它一个逐字字符串文字,它可能有 CR,或者它可能有 CR/LF,具体取决于源文件格式,我们无法真正分辨。
  • @DaisyShipton 你说得对,对不起,我错过了,我会编辑我的问题。

标签: c#


【解决方案1】:

我强烈怀疑这是因为您的字符串 实际上 以 CR/LF 开头。

假设您的代码实际上使用了这样的逐字字符串文字:

// Note the @
var kvpAttribute = new KeyValuePair<string,string>("rsaKey", @"----RSAKEY----
AWEACAWE123213AWEAWECAWE!AWEAWE
AWEAWEAWEAWEAWEQEAWEAWHYTAWEAAA
----END RSA KEY ----");

...源文件的行尾将被传播到文字中。

“解决”这个问题的最简单方法就是将字符串中的“\r\n”替换为“\r”:

string rsaKey = @"----RSAKEY----
AWEACAWE123213AWEAWECAWE!AWEAWE
AWEAWEAWEAWEAWEQEAWEAWHYTAWEAAA
----END RSA KEY ----";
rsaKey = rsaKey.Replace("\r\n", "\r");
var kvpAttribute = new KeyValuePair<string,string>("rsaKey", rsaKey);

到那时,我希望它会没事。作为一个例子,证明XAttribute 可以只使用“\r”:

using System;
using System.Xml.Linq;

public class Program 
{
    public static void Main() 
    {
        var element = new XElement("foo", new XAttribute("key", "a\rb"));
        Console.WriteLine(element);
    }
}

输出:

<foo key="a&#xD;b" />

这是包含回车的属性值的 XML 表示。如果您期待:

<foo key="a
b" />

...虽然看起来 is 是有效的 XML(这让我感到惊讶),但我相信它实际上会由符合标准的 XML 阅读器处理,就好像它是:

<foo key="a b" />

因此,您似乎不想保留回车,而是用空格替换它们:

rsaKey = rsaKey.Replace("\r\n", "\r").Replace("\r", " ");

【讨论】:

  • 这仍然会给我留下字符串“a ”然后将由正在读取 RSA 密钥的程序读取并拒绝它,因为它不正确。如果可能的话,我需要它来干净地写它,而不需要任何东西。
  • @Dannys:但这正是您的问题所问的不是。您要求维护一个回车,它在 XML 中表示为&amp;#xD;。它不能只是 XML 中的回车,因为那将是无效的 XML。您确定您不想完全删除回车符和换行符吗?
  • @Dannys:我在回答的最后更详细地介绍了这一点。
  • 我指定我希望将其格式化为 KVP 中的格式。我这里有两个配置文件要测试,其中一个与 KVP 一样在单独的行上具有密钥,另一个与 KVP 沿一行进行测试。带有单独行的行工作正常,而没有行的行不行,所以我假设 XML 对不同行上的字符串有效。我只是无法让我的文档从代码中像这样格式化。
  • @Dannys:嗯...我一直认为属性必须在一行中。看起来这是不正确的,但任何符合标准的 XML 解析器应该正确处理实体版本。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2017-02-12
  • 2012-10-03
相关资源
最近更新 更多