Как получить значение атрибута с помощью 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