如何直接读取XML文件并获取XElement值?

10

目前我正在使用:

XElement xe = XElement.ReadFrom

需要一个XmlReader

XmlReader reader = XmlTextReader.Create

这需要一个字符串,而我需要传递一个StringReader

new StringReader

这需要一个TextReader/StreamReader来最终能够将文件路径传递给它:

TextReader textReader = new StreamReader ( file );

有没有更简单的方法?我已经有使用 XElement 的代码了,所以它可以正常工作,但我想削减从 xml 文件获取 XElement 的步骤数量。类似于:

XElement xe = XElement.ReadFrom (string file);

有什么想法吗?
2个回答

11

Joan,使用XDocument.Load(string)

XDocument doc =   XDocument.Load("PurchaseOrder.xml");

一些注释:

  1. 永远不要使用XmlTextReader.Create。使用XmlReader.Create。它是一个静态方法,因此使用哪个派生类引用它并没有区别。使用XmlTextReader.Create是具有误导性的,因为它看起来与XmlReader.Create不同。这两者实际上是相同的。
  2. XmlReader.Create有一个重载,接受一个字符串,就像XDocument.Load一样:XmlReader.Create(string inputUri)
  3. 其实并不存在XElement.ReadFrom。实际上是XNode.ReadFrom

谢谢约翰,但如果我这样做,我还能执行xe.Elements("something").Elements("else").Select等操作吗? - Joan Venge
1
Joan,是的。XElement.Elements这种东西不存在。应该使用XContainer.Elements。我强烈建议你开始注意哪个类定义了哪些东西。很多都是继承来的。 - John Saunders
谢谢约翰,那么静态方法会传递到所有派生类型吗?还有,你说XmlReader.Create接受一个字符串,但那不是文件路径(读取文件内容),对吧?最后,我现在看到XElement.ReadFrom是XNode.ReadFrom,但在这种情况下,它如何出现在XElement下?同样的继承关系吗? - Joan Venge
1
@Joan:是的,静态成员变量总是被继承的(假设它们不是“private”)。XmlReader.Create重载函数接受一个字符串作为URI,但是“filename.typ”则被视为文件路径。是的,继承规则相同。 - John Saunders
1
@Joan:没关系。XDocument.Load(string) 几乎肯定会调用 using (XmlReader reader = XmlReader.Create(string)) {return XDocument.Load(reader);}。换句话说,_所有东西_最终都归结为一个 XmlReader - John Saunders
显示剩余2条评论

4
XElement.ReadFrom(XmlReader.Create(fileName))

但是显式管理文件流对象和XmlReader对象更好-您知道何时关闭流...


那么如果你这样做,读取器和流对象会泄漏内存吗? - Joan Venge
2
@Joan:不,它们不会泄漏资源(在任何情况下都不会泄漏内存)- 只是这些资源直到垃圾回收器最终处理它们之前不会被清理。 - John Saunders
如果你像一个好的程序员一样关心释放资源,你可以使用using语句来包装你的代码,因为XmlReader实现了IDisposable接口:using (var reader = XmlReader.Create("SomeFile.xml")) { var element = XElement.ReadFrom(reader); } - SteveB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接