Чтобы получить атрибуты из NodeList XmlDocument? - PullRequest
2 голосов
/ 24 апреля 2009

У меня есть часть XmlDocument Example.xml, как указано ниже:

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

Здесь я создаю Nodelist и выбираю элемент raplin, чтобы получить его атрибуты.

Теперь я хочу убедиться, что атрибуты 'dotoc' и 'domap' являются атрибутами rapaine с соответствующими значениями, которые всегда фиксированы. Только тогда я могу получить доступ к дочернему узлу'ativeff 'с его атрибутом' meet '. здесь значение только изменяется.
Я написал часть кода, там нет ошибок компиляции, но при отладке я обнаружил, что он не идет в цикл 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 ]

2 голосов
/ 24 апреля 2009

Вы можете сделать это с помощью следующего кода, используя 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 корневого уровня, которые имеют атрибут dotoc со значением «palin», а также имеют атрибут domap со значением «rattmin».

b) В этих rapaine элементах найдите всех derif children.

c) Из этих derif элементов получить все атрибуты meet.

Обратите внимание, насколько лаконичнее становится код.

0 голосов
/ 24 апреля 2009

В зависимости от того, какую версию .NET вы используете, LINQ может упростить это.

0 голосов
/ 24 апреля 2009

Разве вы не можете просто исправить это с помощью простого выражения XPath?

Все вложенные циклы с условием просто напрашиваются на неприятности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...