如何在C#中生成有效的XML?
#1楼
我尝试过的最好的方法是LINQ to XSD (大多数开发人员都不知道)。 您给它一个XSD Schema,它在后台为您生成一个完美映射的,完整的强类型对象模型(基于LINQ to XML),它真的很容易使用-并在其中更新和验证您的对象模型和XML。即时的。 虽然它仍然是“预览”,但我还没有遇到任何错误。
如果您具有如下所示的XSD架构:
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element name="Element1" type="xs:string" />
<xs:element name="Element2" type="xs:string" />
</xs:sequence>
<xs:attribute name="Attribute1" type="xs:integer" use="optional" />
<xs:attribute name="Attribute2" type="xs:boolean" use="required" />
</xs:complexType>
</xs:element>
然后,您可以像这样简单地构建XML:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
或者只是从文件中加载XML,如下所示:
RootElement rootElement = RootElement.Load(filePath);
或像这样保存它:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
rootElement.Untyped
还产生XElement形式的元素(从LINQ到XML)。
#2楼
new XElement("Foo",
from s in nameValuePairList
select
new XElement("Bar",
new XAttribute("SomeAttr", "SomeAttrValue"),
new XElement("Name", s.Name),
new XElement("Value", s.Value)
)
);
#3楼
这取决于场景。 XmlSerializer
当然是一种方法,它具有直接映射到对象模型的优势。 在.NET 3.5中, XDocument
等也非常友好。 如果大小很大,则XmlWriter
是您的朋友。
对于XDocument
示例:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
或与XmlDocument
相同:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
如果您要写入大量数据,那么任何DOM方法(例如XmlDocument
/ XDocument
等)都会迅速占用大量内存。 因此,如果您要从CSV编写一个100 MB的XML文件,则可以考虑使用XmlWriter
。 这是更原始的(一次写入型firehose),但是非常有效(在这里想象一个大循环):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
最后,通过XmlSerializer
:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
这是映射到类等的不错模型。 但是,如果您执行简单的操作(或者所需的XML确实与对象模型没有直接关联),则可能会过大。 XmlSerializer
另一个问题是它不喜欢序列化不可变类型:所有内容都必须具有公共的getter 和 setter(除非您通过实现IXmlSerializable
自己完成所有工作,在这种情况下,使用XmlSerializer
并不会带来太多XmlSerializer
)。
#4楼
我试试看XLINQ(阅读:LINQ to XML)。 它简单,直观,易于编辑。
示例: 使用XLinq读取和写入XML
#5楼
XmlWriter是编写良好XML的最快方法。 XDocument,XMLDocument和其他一些工具也可以很好地工作,但是并未针对编写XML进行优化。 如果要尽快编写XML,则绝对应该使用XmlWriter。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3161915