2015-02-11 85 views
0

鉴于以下XML:C#:获取属性的的XPath对于XML元素

<enrollment> 
    <school> 
     <students> 
      <studentA fname="John" lname="Doe" age="23" /> 
      <studentB fname="Mary" lname="Johnson" age="22" /> 
     </students> 
    </school> 
</enrollment> 

,这里是我的代码来遍历属性 -

foreach(XmlAttribute attr in node.Attributes) 
{ 
    //--get the XPath for each attribute 
} 

其中节点= “studentA”我如何获得每个属性的XPath?

编辑: 基本上我想在这里实现的是比较两个节点是否相同。所以我必须检查他们是否有相同的名称,属性和属性值。因此,给定一个节点,我需要一个符合条件的xpath表达式。

+0

检查他们是否具有“**相同名称,属性和属性值**”的哪个部分需要知道属性的XPath? – JLRishe 2015-02-11 05:55:25

+0

@JLRishi我忘了提及要比较的两个节点来自不同的XML文件。给定xml1上的节点,我将获取其xpath并使用它来查找xml2上是否存在类似的节点。但嘿谢谢你澄清事情,我意识到我真正需要的是节点的xpath,属性是xpath表达式的条件。 – jmc 2015-02-11 06:03:49

回答

2

,你可以直接把它作为像所有studentA节点 -

Xpath- "//studentA"

或迭代一个特定节点 - Xpath- "enrollment/school/students/studentA"

如果你想找到属性FNAME

Xpath- "enrollment/school/students/studentA[@fname]"

Assum ING myXml是你的XmlDocument 可以遍历特定节点属性喜欢 -

 System.Xml.XmlNode xn = myXml.SelectSingleNode("enrollment/school/students/studentA"); 
     foreach (System.Xml.XmlAttribute attrib in xn.Attributes) 
     { 
      // find attribute name using attrib.Name 
      string sAttribName = attrib.Name; 
      if (sAttribName == "fname") 
      { 
       //Check your codes here 
      }    
     } 
+0

好的。我更新了代码。 – 2015-02-11 05:49:11

+0

+1对于这一点,我现在可以得到FNAME的属性的元素,但u能也告诉我的XPath表达式将匹配一个元素是否已经超过1个属性。例如fname,lname,年龄 – jmc 2015-02-11 06:32:41

+0

@wintersolstice,您是否在XML中使用XMLDocument或Linq? – 2015-02-11 06:37:06

0
You can use enrollment/school/students/studentA/@fname 

@attribute是属性选择。

+0

Rohit的回答是正确的。我有一个错字。它应该是招生/学校/学生/ studentA [@fname] – Sarathy 2015-02-11 06:01:03