Xml:使用参数创建x-path的最佳实践

时间:2010-12-02 06:46:12

标签: .net xml xpath

使用参数创建x-path的最佳做法是什么?

我必须选择xml节点,其中属性具有精确值,例如:

XmlNode node = parentNode.SelectSingleNode(
  string.Format("./field1/field2[@attributeName='{0}']", valueRequired));

4 个答案:

答案 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 的可能性。