【发布时间】:2009-05-08 14:23:19
【问题描述】:
XElement root = XElement.Load(xmlReader);
IEnumerable<XElment> items = root.Elements("?????????");
在哪里????是,我可以添加路径还是必须是单个 xml 元素名称?
即。我可以做 /blah/blah2/asdf 吗?
【问题讨论】:
XElement root = XElement.Load(xmlReader);
IEnumerable<XElment> items = root.Elements("?????????");
在哪里????是,我可以添加路径还是必须是单个 xml 元素名称?
即。我可以做 /blah/blah2/asdf 吗?
【问题讨论】:
???? 应该是单个 xml 元素名称。
严格来说,Elements() 方法接受 XName 参数。幸运的是,有一个从 string 到 XName 的隐式转换。
XName name = "Book";
XName name2 = "{http://schemas.company.com/books}Book"; // XName with a namespace
要选择路径,请使用System.Xml.XPath 命名空间(System.Xml.Linq 程序集)中的扩展方法:
IEnumerable<XElment> items = root.XPathSelectElements("Books/Author");
【讨论】:
不,Elements 扩展方法的参数需要是单个元素名称(实际上是 XName,但如果您不需要命名空间,只需将元素名称作为字符串传递),而不是 XPath。
如果要使用 XPath 选择 XElements,还有an extension method for that。包括 System.Xml.XPath 并执行:
IEnumerable<XElement> items = root.XPathSelectElements("your/xpath");
【讨论】:
如果您尝试传递 XPath,您将生成此异常:
未处理的类型异常 'System.Xml.XmlException' 发生在 System.Xml.dll
附加信息:'/' 字符,十六进制值 0x2F, 不能包含在名称中。
您必须将元素名称作为字符串传递。该字符串被隐式转换为 XName 类型,该类型对字符串中可以和不能出现的字符有限制(/、<、> 等)。
【讨论】: