2009-04-24 70 views
2

我的XmlDocument的example.xml的一部分,如下所示:从XmlDocument的NodeList中获取属性?

<rapaine dotoc="palin" domap="rattmin"> 
    <derif meet="local" /> 
    <derif meet="intro" /> 
. 
. 
. 
</rapaine> 

这里我创建一个节点列表和打水元素raplin得到它的属性。

现在我想确保属性'dotoc'和'domap'是否是rapaine的属性,各个值总是固定的。然后,只有我可以通过属性'meet'访问childNodes的'deriff' 。这里的价值只是变化。
我已经写了一部分代码没有编译错误,但在调试时发现它没有进入for循环来检查它的属性和子节点。

XmlNodeList listOfSpineRootNodes = opfXmlDoc.GetElementsByTagName("rapine"); 
for (int x = 0; x < listOfSpineRootNodes.Count; x++) 
    { 
    XmlAttributeCollection spineAttributes = listOfSpineRootNodes[x].Attributes; 
    string id = spineAttributes[0].Value; 
    if (spineAttributes != null) 
    { 
     XmlNode attrToc = spineAttributes.GetNamedItem("dotoc"); 
     XmlNode attrPageMap = spineAttributes.GetNamedItem("domap"); 
     if (attrToc.Value == "palin" && attrPageMap.Value == "rattmine") 
     { 
     if (listOfSpineRootNodes != null) 
     { 
      foreach (XmlNode spineNodeRoot in listOfSpineRootNodes) 
      { 
      XmlNodeList listOfSpineItemNodes = spineNodeRoot.ChildNodes; 
      if (listOfSpineItemNodes != null) 
      { 
       foreach (XmlNode spineItemNode in listOfSpineItemNodes) 
       { 
       if (spineItemNode.NodeType == XmlNodeType.Element 
        && spineItemNode.Name == "derif") 
       { 
        XmlAttributeCollection spineItemAttributes = spineItemNode.Attributes; 

        if (spineItemAttributes != null) 
        { 
        XmlNode attrIdRef = spineItemAttributes.GetNamedItem("meet"); 
        if (attrIdRef != null) 
        { 
         spineListOfSmilFiles.Add(attrIdRef.Value); 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 

能否请你告诉我,我错了.. 感谢....

回答

2

您可以使用XPath执行以下代码。由于XPath是专门用于查询XML文档的语言,因此您应该考虑学习它。大多数新手喜欢在W3schools开始学习。

下面是代码:

XmlNodeList meetList = opfXmlDoc.SelectNodes("/rapaine[(@dotoc = 'palin') and (@domap = 'rattmin')]/derif/@meet") 
if (meetList.Count > 0) 
{ 
    foreach (XmlNode meet in meetList) 
    { 
    spineListOfSmilFiles.Add(meet.Value); 
    } 
} 

为了便于参考,XPath表达式:

/rapaine[(@dotoc = 'palin') and (@domap = 'rattmin')]/derif/@meet 

可以如解释:

a)找出具有所有rapaine根级别的元素具有值“palin”的属性dotoc,并且还具有值为“rattmin”的属性domap

b)在那些rapaine元素内,找到所有derif孩子。

c)在这些derif元素中,检索所有meet属性。

请注意代码变得更简洁。

0

你就不能用一个简单的XPath表达式解决这一问题?

带条件的所有嵌套循环只是简单地要求麻烦。

+0

不,我不能使用XPath。说实话,我不知道如何在这里使用XPath。 谢谢 – 2009-04-24 08:01:50

+0

是的,你可以使用XPath来做这件事,但你必须仔细研究它。 – Natrium 2009-04-24 08:15:38

0

取决于你使用的是什么版本的.NET,LINQ可能能够简化它。