Tod*_*son 6 c# xml xmldocument xml-attribute selectsinglenode
我正在使用包含类似于此的结构的XML文档:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Run Code Online (Sandbox Code Playgroud)
我目前正以这种方式将文件从文件加载到XML文档中:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行下一行代码时,我遇到了一个问题,只有这个特定的文档:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
Run Code Online (Sandbox Code Playgroud)
我是否在正确的轨道上猜测这是因为使用名为'id'的属性的问题或者我在代码中遗漏了某些内容而返回null?
Mik*_*nen 10
我不能使用XML文件复制它
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
Run Code Online (Sandbox Code Playgroud)
和代码
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
Run Code Online (Sandbox Code Playgroud)
这将按预期返回非null节点.
更新
加入后xmlns="example.org"
的<MT>
元素,我不得不配置一个命名空间经理为XPath和使用的命名空间的事件.由于某种原因无法使默认命名空间生效.
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");
XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);
Run Code Online (Sandbox Code Playgroud)
试图让它发挥作用时,有一件事让我很困惑.为什么XmlNamespaceManager需要文档中的XmlNameTable,如果不是为了找出它包含的命名空间?在,为什么我需要定义NameTable 和命名空间?如果有人知道可以发表评论,我会很感激.