如何为这个XDocument编写xpath?

时间:2012-11-20 05:48:12

标签: c# xpath linq-to-xml

    <tags>
    <data mode="add" name="ttt" oldindex="-1" index="-1" oldnumber="1" number="1"               type="VAR_INT" value="72" /> 
     <data mode="delete" name="test3d" oldindex="-1" index="-1" oldnumber="1" number="1"            type="VAR_INT" value="72" /> 
      </tags>

我想检查xml中是否存在“mode”

        xdDiffData.XPathSelectElement("//tags[@mode='add']") != null &&        xdDiffData.XPathSelectElement("//tags[@mode='delete']") != null

这总是给出错误......如何做到这一点......?

4 个答案:

答案 0 :(得分:2)

如果要确保每个mode元素中都存在data属性,那么您应该更好地迭代所有数据元素,以便以这种方式查找mode属性:< / p>

XDocument doc = XDocument.Load("XmlFile.xml");
var nodes = doc.Descendants("data");

foreach (var node in nodes)
{
    var attrMode = node.Attribute("mode");
    if (attrMode == null)
    {
        // mode attribute is not available for this data element
    }
}

使用Linq:

if (nodes.Where(c => c.Attribute("mode") == null).Count() == 0)
{
    var result = nodes.All(e => 
                           e.Attribute("mode").Value.Equals("add") ||
                           e.Attribute("mode").Value.Equals("delete"));
} 
else
{
    // 'mode' attribute is missing for one or more 'data' element(s)
}

如果result等于true,则表示所有数据元素的mode属性都设置为值"add""delete"

答案 1 :(得分:0)

您缺少'data'元素。尝试

xdDiffData.XPathSelectElement("//tags/data[@mode='add']") != null &&        xdDiffData.XPathSelectElement("//tags/data[@mode='delete']") != null

答案 2 :(得分:0)

    xdDiffData.XPathSelectElement("/tags/data[@mode='add']") != null

答案 3 :(得分:0)

  

我想检查xml中是否存在“mode”

使用

//@mode

如果此XPath表达式选择节点,则意味着XML文档中存在名为mode的属性。

或者你可以使用

boolean(//@mode)

这会产生一个布尔值 - true()false()