Как получить значение атрибута с помощью SelectSingleNode?

Я разбираю XML-документ, мне нужно узнать значение gid (атрибут) (3810).

На основе SelectSingleNode(). Я обнаружил, что найти имя атрибута и его значение непросто.

Могу ли я использовать этот метод или я должен переключиться на другой способ.

Прикреплен мой код.

Как я могу использовать book obj, чтобы получить значение атрибута 3810 для gid. Спасибо.

Мой файл test.xml, как показано ниже

<?xml version="1.0" ?>
<root>
   <VersionInfo date="2007-11-28" version="1.0.0.2" />
   <Attributes>
      <AttrDir name="EFEM" DirID="1">
         <AttrDir name="Aligner" DirID="2">
            <AttrDir name="SequenceID" DirID="3">
               <AttrObj text="Slot01" gid="3810" unit="" scale="1" />
               <AttrObjCount value="1" />
           </AttrDir>
         </AttrDir>
      </AttrDir>
   </Attributes>
</root>

Я написал test.cs, как показано ниже

public class Sample
{    
    public static void Main()
    {    
        XmlDocument doc = new XmlDocument();
        doc.Load("test.xml");

        XmlNode book;
        XmlNode root = doc.DocumentElement;

        book = root.SelectSingleNode("Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]");

        Console.WriteLine("Display the modified XML document....");
        doc.Save(Console.Out);
    }
}

[Обновление 06/10/2010]

  • XML файл представляет собой сложный файл. Включены тысячи гидов. Но для каждого из Xpath, gid уникален.

  • Я загружаю xml файл в элемент управления TreeView. this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);. Когда событие treeView1_AfterSelect произошло, e.Node.FullPath вернется как значение строки.

  • Я разбираю строку Value e.Node.FullPath. Затем я получил член XPath Above. Затем я попытался найти, какой объект gid был выбран.

Мне нужно найти значение gid как возвращаемое значение.

Ответ 1

Вы можете написать

XmlAttribute gidAttribute = (XmlAttribute)book.Attributes.GetNamedItem("gid");
String gidValue = null;
if (gidAttribute!=null)
    value = gidAttribute.Value;

В качестве альтернативы разверните Xpath для извлечения атрибута, например

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]/@gid

Если @gid уникален, вы можете просто использовать Xpath

"//AttrObj[@gid='3810']"

Получить желаемый node с данным идентификатором. Но обратите внимание, что каждый запрос будет искать весь документ. Будет более эффективно извлекать все узлы, а затем помещать их в карту с ключом с идентификатором.

"//AttrObj[@gid]"

Используйте XmlNode.SelectNodes, чтобы получить список всех атрибутов AttrObj с атрибутом @gid.

Ответ 2

Вы можете запросить XmlDocument сам не DocumentRoot:

XmlDocument doc = new XmlDocument();
XmlNode book = doc.SelectSingleNode("..");
if (book != null)
{
    XmlAttribute gid = book.Attributes["gid"];
    if (gid != null)
    {
       string value = gid.Value;
    }
}

Ответ 3

Проблема здесь в том, что ваш XPath был неправ. У вас было это:

Attributes[AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']]

который либо выбирает, либо не выбирает элемент Атрибуты в зависимости от того, совпадают ли все имена. Этот XPath должен сразу перейти к атрибуту gid:

Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid