将LinqToXml表达式转换为XPath

时间:2016-03-29 15:21:19

标签: c# xml linq xpath

我有这个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>

3 个答案:

答案 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'函数将该元素转换为字符串。