在 C# 中使用 XML 文字?

Posted

技术标签:

【中文标题】在 C# 中使用 XML 文字?【英文标题】:Use XML Literals in C#? 【发布时间】:2021-05-22 10:37:27 【问题描述】:

是否可以在 C# 代码文件中添加文字 XML 数据?我目前正在使用多行字符串文字,但如您所见,它变得混乱。有更好的方法吗?

string XML = @"<?xml version=""1.0"" encoding=""utf-8""?>
<customUI xmlns=""http://schemas.example.com/customui"">
    <toolbar id=""save"">
    </toolbar>
</customUI>";

【问题讨论】:

【参考方案1】:

XML literals 是 VB.NET 的一个特性,而不是 C#。

您发布的内容与 C# 中的内容一样接近。

您可能需要考虑用单引号替换嵌入的双引号(因为这两种类型都是有效的 XML)。

对于大量的 XML,您可能需要考虑 Marc 的回答 - 使用 XML 文件(加载一次并存储在内存中),这样您就可以利用 XML 编辑器。

【讨论】:

这是我作为两种语言的开发人员真正想要特定 VB.NET 功能的少数几次之一。 :) 它使在 VB.NET 中编写 XML 变得如此简洁,并且比序列化快得多。【参考方案2】:

如果 XML 大到足以妨碍您,请考虑改用平面 .xml 文件,该文件可以从磁盘加载,也可以作为资源嵌入。只要您只加载一次(可能在静态构造函数中),这对性能没有影响。它将更容易维护,因为它将使用 IDE 的 XML 文件编辑器。而且它不会妨碍您的代码。

【讨论】:

【参考方案3】:

参考我的评论,我不记得我在哪里看到的,但我终于找到了XmlBuilder link。

回想起来,Linq to XML 似乎是您最好的选择。它比连接 XML 字符串更干净、更快、更易于维护:

XNamespace ns = "http://schemas.example.com/customui";
XDocument doc = new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XElement(ns + "customUI",
                        new XElement(ns + "taskbar",
                            new XAttribute("id", "save"))
                    )
                );

var stringWriter = new StringWriter();
doc.Save(stringWriter); //Write to StringWriter, preserving the declaration (<?xml version="1.0" encoding="utf-16" standalone="yes"?>)
var xmlString = stringWriter.ToString(); //Save as string
doc.Save(@"d:\out.xml"); //Save to file

【讨论】:

【参考方案4】:

作为一种特殊且非常特定于案例的解决方案,如果您碰巧在使用 Razor 引擎的 ASP.NET 环境中工作,则可以在 CShtml 文件中:

Func<MyType, HelperResult> xml = @<root>
    <item>@(item.PropertyA)</item>
    <item>@(item.PropertyB)</item>
    <item>@(item.PropertyC)</item>
</root>;

加上一个扩展方法:

public static XDocument ToXDocument<T>(this Func<T, HelperResult> source, T item)

    return XDocument.Parse(source(item).ToHtmlString());

然后你可以:

XDocument document = xml.ToXDocument(new MyType() 
    PropertyA = "foo",
    PropertyB = "bar",
    PropertyC = "qux",
);

再一次,奇特的? 是的。具体情况? 是的。但它有效,并提供了很好的智能感知。 (请注意,它还会给出一堆有效性警告,具体取决于文档验证版本

【讨论】:

我怀疑我会在实践中使用它,但它肯定是一种非常有创意的方法。赞一个!【参考方案5】:

我们在 C# 中最接近的方法是通过 LINQ,类似这样:

var xml = XDocument.Load(
    new StringReader(@"<Books>
    <Book author='Dan Brown'>The Da Vinci Code</Book>
    <Book author='Dan Brown'>The Lost Symbol</Book>
    </Books>"));

var query = from book in xml.Elements("Books").Elements("Book")
    where book.Attribute("author").Value == "Dan Brown"
    select book.Value;

foreach (var item in query) Console.WriteLine(item);

【讨论】:

以上是关于在 C# 中使用 XML 文字?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用十六进制文字将整数设置为负值

在 C# 中使用 default(...) 与文字值声明变量 [关闭]

如何使用C#将包含文字、图片和表格的二进制数据写入到word文件中

正则表达式 包含在 XML 元素中

在PHP中使用文字xml的SOAP

使用 C# 使用特殊字符写入 XML 文档