在 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# 中使用 default(...) 与文字值声明变量 [关闭]