从XmlDocument的NodeList获取属性?

时间:2009-04-24 07:53:27

标签: c# xml xmldocument

我有一部分XmlDocument Example.xml,如下所示:

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

这里我创建一个Nodelist并获取元素raplin以获取其属性。

现在我想确保属性'dotoc'和'domap'是rapaine的属性,各自的值总是固定的。然后我只能通过其属性'meet'访问childNodes'feriff'。这里的价值只会改变 我写了一部分代码没有编译错误,但在调试时我发现它不会进入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);
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
你能告诉我我哪里出错了吗? 感谢....

3 个答案:

答案 0 :(得分: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)查找具有值为“palin”的属性rapaine的所有dotoc根级元素,并且还具有值为“rattmin”的属性domap

b)在rapaine个元素中,找到所有derif个孩子。

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

请注意代码的简洁程度。

答案 1 :(得分:0)

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

所有带条件的嵌套循环只是在寻找麻烦。

答案 2 :(得分:0)

取决于您使用的.NET版本,LINQ可能能够简化此操作。