我有这个linq表达式,我需要转换为XPath select元素:
XElement transIdElement = (from criteria in searchCriteria.Descendants("CRITERIA")
where criteria.Element("DataPointName).Value == "TransactionNumber"
select criteria.Element("CriteriaComparisonValue")).FirstOrDefault();
我尝试了这个:
var transIdElement = searchCriteria.XPathSelectElement("//CRITERIA/DataPointName[text() = 'TransactionNumber']/CriteriaComparisonValue");
但结果我得了null。
XML示例是:
<SEARCH>
<ADVANCED_CRITERIA>
<CRITERIA>
<DataPointName>TransactionNumber</DataPointName>
<CriteriaComparisonValue>12457845</CriteriaComparisonValue>
</CRITERIA>
</ADVANCED_CRITERIA>
</SEARCH>
答案 0 :(得分:2)
使用..
访问parent::node()
并尝试
//CRITERIA/DataPointName[text() = 'TransactionNumber']/../CriteriaComparisonValue
在LINQpad中进行快速测试:
var f = @"c:\temp\x\a.xml";
var searchCrit = XDocument.Load(f);
searchCrit.XPathSelectElement("//CRITERIA/DataPointName[text() = 'TransactionNumber']/../CriteriaComparisonValue").Value.Dump();
产生
12457845
答案 1 :(得分:2)
void Main()
{
string xml = @"<SEARCH>
<ADVANCED_CRITERIA>
<CRITERIA>
<DataPointName>TransactionNumber</DataPointName>
<CriteriaComparisonValue>12457845</CriteriaComparisonValue>
</CRITERIA>
</ADVANCED_CRITERIA>
</SEARCH>";
var searchCriteria = XElement.Parse(xml);
searchCriteria.XPathSelectElements("//CRITERIA[DataPointName='TransactionNumber']/CriteriaComparisonValue").Dump();
}
答案 2 :(得分:1)
LINQ-to-XML查询的更准确的XPath转换如下:
SoftAVCEncoder
以下是上述谓词表达式(方括号中的表达式)如何工作的一瞥。
//CRITERIA[DataPointName = 'TransactionNumber']/CriteriaComparisonValue
引用上下文元素的名为DataPointName
的子元素。在此特定谓词中,上下文元素为"DataPointName"
。
CRITERIA
表示XPath中的literal-string。当一个元素与XPath中的字符串进行比较时,通过调用XPath 'TransactionNumber'
函数将该元素转换为字符串。