使用参数创建x-path的最佳做法是什么?
我必须选择xml节点,其中属性具有精确值,例如:
XmlNode node = parentNode.SelectSingleNode(
string.Format("./field1/field2[@attributeName='{0}']", valueRequired));
答案 0 :(得分:2)
这取决于valueRequired
是否会产生令人讨厌的价值,例如'
。但对于简单的值应该可以正常工作。
否则,LINQ-to-XML相当不错:
// where parentNode is XElement
var node = (from el in parentNode.Elements("field1").Elements("field2")
where (string) el.Attribute("attributeName") == valueRequired
select el).FirstOrDefault();
(根据需要将(string)
替换为其他类型)
使用LINQ而不是XmlElement,这是类似的东西:
var parentNode = node.SelectNodes("./field1/field2[@attributeName]")
.Cast<XmlElement>()
.Where(el => el.GetAttribute("attributeName") == valueRequired)
.FirstOrDefault();
另一个选项(没有任何 LINQ)只需使用foreach手动循环。
答案 1 :(得分:1)
有时候X-Path表示法比LINQ更短更清晰,在这种情况下我更喜欢使用X-Path而不是LINQ。在您的情况下,因为您已经知道属性类型,所以应该很容易确定是否包含引号。
您应该考虑通过以下方法使用 System.Xml.XPath 的元素:
XmlReader xmlReader = XmlReader.Create(xmlFile);
XElement xmlRoot = XElement.Load(xmlReader);
xmlReader.Close();
IEnumerable<XElement> nodes =
xmlRoot.XPathSelectElements(string.Format("./field1/field2[@attributeName='{0}']", valueRequired));
答案 2 :(得分:1)
你的方法很好。您应该知道valueRequired
中的内容。如果您不相信其来源,那么就像使用任何不受信任的数据一样对其进行清理。
此外,您无需使用./
启动相对路径,只需使用:
field1/field2[@attributeName='{0}']
答案 3 :(得分:0)
XPath引擎的主机可以创建属于上下文的变量。提供此功能的主机示例是XSLT 。
在XSLT中,只需编写:
field1/field2[@attributeName=$valueRequired]"
在.NET中创建XPath变量和函数的一种方法是使用 XsltContext
类及其方法ResolveVariable()
和 ResolveFunction()
强>
要记住的另一件事:永远不要盲目地将用户输入插入到XPath表达式的“骨架”中。请注意XPath injection 的可能性。