2012-01-07 23 views
28

Có thể thêm dữ liệu XML theo nghĩa đen trong một tệp mã C# không? Tôi hiện đang sử dụng một chuỗi chữ nhiều màu nhưng nó bị lộn xộn như bạn có thể thấy. Bất kỳ cách nào tốt hơn để làm điều này?Sử dụng XML Literals trong C#?

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

Trả lời

37

XML literals là một tính năng của VB.NET, chứ không phải C#.

Những gì bạn đã đăng gần như bạn có thể nhận được trong C#.

Bạn có thể xem xét thay thế các dấu ngoặc kép được nhúng bằng dấu nháy đơn mặc dù (vì cả hai loại đều là XML hợp lệ).

Đối với số lượng XML lớn hơn, bạn có thể xem xét câu trả lời từ Marc - sử dụng tệp XML (được tải một lần và được lưu trữ trong bộ nhớ), để bạn có thể tận dụng trình soạn thảo XML.

+8

này là một trong số ít những nhà phát triển ở cả hai ngôn ngữ mà tôi thực sự muốn có một tính năng VB.NET cụ thể. :) Nó làm cho việc viết XML trong VB.NET trở nên sạch sẽ và nhanh hơn rất nhiều so với tuần tự hóa. –

17

Nếu XML đủ lớn để cản đường, hãy xem xét sử dụng tệp .xml phẳng thay vào đó, được tải từ đĩa hoặc được nhúng dưới dạng tài nguyên. Miễn là bạn chỉ tải nó một lần (có lẽ trong một constructor tĩnh) điều này sẽ làm cho không có sự khác biệt để thực hiện. Nó sẽ dễ dàng hơn để duy trì, vì nó sẽ sử dụng trình soạn thảo tệp XML của IDE. Và nó sẽ không cản trở mã của bạn.

12

Với tham chiếu đến nhận xét của tôi, tôi không thể nhớ lại nơi tôi thấy điều này, nhưng cuối cùng tôi đã tìm thấy XmlBuilder link.

Nhìn lại, có vẻ như LINQ to XML sẽ là đặt cược tốt nhất của bạn. Đó là sạch hơn, nhanh hơn và dễ bảo trì hơn concatenating chuỗi 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 
5

Là một đặc biệt, và giải pháp trường hợp cụ thể rất, nếu bạn tình cờ được làm việc trong một môi trường ASP.NET sử dụng công cụ Razor, trong một CSHTML nộp bạn có thể:

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

với việc bổ sung một phương pháp khuyến nông:

public static XDocument ToXDocument<T>(this Func<T, HelperResult> source, T item) 
{ 
    return XDocument.Parse(source(item).ToHtmlString()); 
} 

bạn có thể sau đó:

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

Một lần nữa, đặc biệt? . Trường hợp cụ thể? . Nhưng nó hoạt động, và cung cấp cho Intellisense tuyệt vời. (tâm trí bạn, nó cũng sẽ cung cấp một loạt các cảnh báo tính hợp lệ, tùy thuộc vào xác nhận phiên bản tài liệu)

+0

Tôi nghi ngờ tôi sẽ sử dụng điều này trong thực tế, nhưng nó chắc chắn là một cách tiếp cận rất sáng tạo. Thanh danh! –

0

Gần nhất chúng ta có thể có trong C# sẽ được thông qua LINQ, một cái gì đó như thế:

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);