我正在解析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);
}
}
[2010年6月10日更新]
xml文件是一个复杂的文件。包括成千上万的gids。但对于每个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值作为返回值。
答案 0 :(得分:8)
你可以写
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获取所需的节点。但请注意,每个请求都将搜索整个文档。获取所有节点,然后将它们放入地图中,以id键入。
将更有效"//AttrObj[@gid]"
使用XmlNode.SelectNodes
获取具有@gid属性的所有AttrObj的列表。
答案 1 :(得分:4)
您可以查询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;
}
}
答案 2 :(得分:0)
这里的问题是他们的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