Как получить значение атрибута, используя SelectSingleNode? - PullRequest
13 голосов
/ 09 июня 2010

Я анализирую документ 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]

  1. XML-файл является сложным файлом.Включены тысячи гидов.Но для каждого из Xpath gid уникален.

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

  3. Я анализирую строковое значение e.Node.FullPath.Тогда я получил член XPath Above.Затем я попытался найти, какой элемент gid был выбран.

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

Ответы [ 3 ]

8 голосов
/ 09 июня 2010

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

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']"

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

"//AttrObj[@gid]"

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

4 голосов
/ 09 июня 2010

Вы можете запросить 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;
    }
}
0 голосов
/ 04 января 2013

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

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

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

Attributes/AttrDir[@name='EFEM']/AttrDir[@name='Aligner']/AttrDir[@name='SequenceID']/AttrObj[@text='Slot01']/@gid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...