2012-11-20 116 views
1
<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或不如何为此XDocument编写xpath?

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

这总是给人false..how做到这一点...?

回答

0

您错过了'data'元素。尝试

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

是由于它的工作.. :) – user1806245

+0

@ user1806245无后顾之忧。如果您发现它有帮助,请接受答案。干杯。 –

+0

当然............ – user1806245

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

如果你想确保mode属性存在于每个data元素,那么你就应该更好地遍历所有数据元素去寻找mode属性是这样的:

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"

+0

+1不使用XPath是正确的选择。 –

+0

+1不错。比修复XPath更清洁的解决方案 –

0

我要检查是否 “模式” 是存在于XML或不

使用

//@mode 

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

或者你可以使用

boolean(//@mode) 

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