如何在.NET中使用XmlWriter创build一个XmlDocument?
许多.NET函数使用XmlWriter输出/生成XML。 输出到一个文件/string/内存是一个非常操作:
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere); xw.WriteStartElement("root"); ...
有时,您需要操作生成的Xml,因此希望将其加载到XmlDocument中,或者由于其他原因可能需要XmlDocument,但是必须使用XmlWriter生成XML。 例如,如果您在仅输出到XmlWriter的第三方库中调用函数。
你可以做的事情之一是写入XML到一个string,然后将其加载到您的XmlDocument:
StringWriter S = new StringWriter(); XmlWriter xw = XmlWriter.Create(S); /* write away */ XmlDocument xdoc = new XmlDocument(); xdoc.LoadXml(S.ToString());
但是这样做效率不高 – 首先将所有的xml信息序列化为一个string,然后再次parsingstring来创buildDOM。
你怎么能指望一个XmlWriter直接build立一个XmlDocument?
这里至less有一个解决scheme:
XmlDocument doc = new XmlDocument(); using (XmlWriter writer = doc.CreateNavigator().AppendChild()) { // Do this directly writer.WriteStartDocument(); writer.WriteStartElement("root"); writer.WriteElementString("foo", "bar"); writer.WriteEndElement(); writer.WriteEndDocument(); // or anything else you want to with writer, like calling functions etc. }
显然XpathNavigator给你一个XmlWriter当你调用AppendChild()
有关信息,请访问Martin Honnen: http ://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
你可以做相反的事情:首先使用DOM构buildXmlDocument
,然后将其写入一个XmlWriter
:
XmlDocument xdoc = new XmlDocument(); ... // build the document StringWriter S = new StringWriter(); XmlWriter xw = XmlWriter.Create(S); xdoc.WriteTo(xw);
您可以使用XMLWriter类编写XML文件。 这是一个例子。
XmlWriterSettings objSetting = new XmlWriterSettings(); objSetting.Indent = true; objSetting.NewLineOnAttributes = true; System.Text.StringBuilder sb = new System.Text.StringBuilder(); using (XmlWriter objWriter = XmlWriter.Create(sb, objSetting)) { //Note the artificial, but useful, indenting objWriter.WriteStartDocument(); objWriter.WriteStartElement("books"); ////////Start Book Element/////// objWriter.WriteStartElement("book"); objWriter.WriteStartAttribute("ISBN"); objWriter.WriteValue("asp1"); objWriter.WriteEndAttribute(); objWriter.WriteStartElement("Title"); objWriter.WriteValue("ASP.NET"); objWriter.WriteEndElement(); objWriter.WriteElementString("ReleaseDate", "11/11/2010"); objWriter.WriteStartElement("Pages"); objWriter.WriteValue(200); objWriter.WriteEndElement(); //price objWriter.WriteEndElement(); //book ////////End Book Element/////// ////////Another Element ////////Start Book Element/////// objWriter.WriteStartElement("book"); objWriter.WriteStartAttribute("ISBN"); objWriter.WriteValue("c#2"); objWriter.WriteEndAttribute(); objWriter.WriteStartElement("Title"); objWriter.WriteValue("C#.NET"); objWriter.WriteEndElement(); objWriter.WriteElementString("ReleaseDate", "10/11/2010"); objWriter.WriteStartElement("Pages"); objWriter.WriteValue(500); objWriter.WriteEndElement(); objWriter.WriteEndElement(); //book ////////End Book Element/////// objWriter.WriteEndElement(); //books objWriter.WriteEndDocument(); } File.WriteAllText(Server.MapPath("BooksList.xml"), sb.ToString());
XmlWriter背后的想法是等到修改完数据之后再开始写作。
XmlWriter没有考虑到你的情况。
或
- 等到你知道你的数据将在写入之前
要么
- 做你现在正在做的事情
如果是双向的(MemoryStream),就有一个XmlWriter写入的底层Stream对象,您可以简单地将其重新定位到-O-,然后使用XmlDocument.Load(stream)中的Stream对象。
HTH,
ž