我有一个简单的类,基本上只包含一些值.我重写了ToString()
方法以返回一个很好的字符串表示.
现在,我想创建一个ToXml()
方法,它将返回如下内容:
Bla Foo
当然,我可以只使用一个StringBuilder
在这里,但我想返回XmlNode
或XmlElement
,与其一起使用XmlDocument.AppendChild
.
我似乎并没有能够创造出一个XmlElement
比调用其他的XmlDocument.CreateElement
,所以我不知道我刚才忽略任何东西,或者如果我真的要么必须在任何一个传球XmlDocument
或者ref XmlElement
一起工作,或者有函数返回一个包含字符串我想要的XML?
我建议使用System.Xml.Linq的XDoc和XElement而不是XmlDocument.这样会更好,您将能够在查询和解析XML时使用LINQ功能:
使用XElement,您的ToXml()方法将如下所示:
public XElement ToXml() { XElement element = new XElement("Song", new XElement("Artist", "bla"), new XElement("Title", "Foo")); return element; }
从W3C 文档对象模型(核心)1级规范(粗体是我的):
本规范定义的大多数API都是接口而不是类.这意味着实际实现只需要公开具有已定义名称和指定操作的方法,而不是实际实现直接对应于接口的类.这允许DOM API在具有自己的数据结构的遗留应用程序之上或在具有不同类层次结构的较新应用程序之上实现为薄单板.这也意味着,普通构造(在Java或C++的意义上)不能被用于创建DOM对象,由于要构造的基础对象可以具有到DOM接口的关系不大.面向对象设计中的传统解决方案是定义工厂方法,这些方法创建实现各种接口的对象实例.在DOM Level 1中,实现某些接口"X"的对象是由Document接口上的"createX()"方法创建的; 这是因为所有DOM对象都存在于特定Document的上下文中.
AFAIK,除了构造函数之外,你不能创建任何XmlNode
(XmlElement, XmlAttribute, XmlCDataSection
等)XmlDocument
.
此外,请注意,您不能使用XmlDocument.AppendChild()
不是通过同一文档的工厂方法创建的节点.如果您有来自其他文档的节点,则必须使用XmlDocument.ImportNode()
.
您可能希望了解如何使用.NET的内置功能将对象序列化和反序列化为XML,而不是ToXML()
在每个基本上只是数据传输对象的类上创建方法.
我已经成功地在几个项目中使用了这些技术,但是现在还没有方便的实现细节.稍后我会用自己的例子尝试更新我的答案.
以下是Google返回的几个示例:
.NET中的XML序列化作者:Venkat Subramaniam http://www.agiledeveloper.com/articles/XMLSerialization.pdf
如何将对象序列化和反序列化为XML http://www.dotnetfunda.com/articles/article98.aspx
使用.NET XML属性自定义.NET对象XML序列化http://blogs.microsoft.co.il/blogs/rotemb/archive/2008/07/27/customize-your-net-object-xml-serialization-with-净XML的attributes.aspx
XmlNodes附带一个OwnerDocument属性.
也许你可以这样做:
//Node is an XmlNode pulled from an XmlDocument XmlElement e = node.OwnerDocument.CreateElement("MyNewElement"); e.InnerText = "Some value"; node.AppendChild(e);