读取特定的XML节点(值,而不仅仅是InnerText)并将值放在TextBox中

时间:2016-02-22 12:03:10

标签: c# xml winforms linq

我现在已经挣扎了一个星期,因为我无法独自解决这个问题,我请求你的帮助。

我正在制作一个C#WinForm项目,我必须阅读xml节点的特定部分(主要是2个属性)并且必须将2个属性放入2个不同的文本框中。我尝试过使用标准XML命令和LINQ to XML命令都不起作用。我将使用我的代码部分粘贴xml的一部分。谢谢大家的帮助和指导。

XML:

<xsd xmlns="https://www.imsglobal.org/sites/default/files/xsd/ims_qtiasiv1p2p1.xsd">
    <title title="SMALL TEST 1" ident="0">
    <intro> SOME INTRO TEXT </intro>
    <item title="Single_choice 1" ident="1">

C#代码:

FileStream READER = 
        new FileStream(ShowPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

XmlDocument Test = new XmlDocument();
Test.Load(READER);
Test.Load(ShowPath);
XmlNodeList NodeList = Test.GetElementsByTagName("xsd");
XmlNode Title = Test.SelectSingleNode("//title[@title='SMALL TEST 1']");

而且我还没有找到如何导航到xml中的特定节点。 XElement只返回一些错误。再次感谢大家的帮助!

2 个答案:

答案 0 :(得分:0)

  

&#34; ..而且我还没有设法找到如何导航到xml中的特定节点&#34;

这里的核心问题是,您的XML具有默认命名空间

xmlns="https://www.imsglobal.org/sites/default/files/xsd/ims_qtiasiv1p2p1.xsd"

这意味着问题中显示的所有 XML元素都会在此命名空间中被考虑(因为没有前缀的后代元素会隐式地继承祖先的默认命名空间)。无论您是使用XmlDocument还是使用更有利的LINQ-to-XML,此概念都适用。

现在,要使用XPath访问命名空间中的元素,您需要使用XmlNamespaceManager,注册前缀以引用XML默认命名空间,然后在XPath中正确使用已注册的前缀,如下所示:

var nsMgr = new XmlNamespaceManager(new NameTable());
nsMgr.AddNamespace("d", "https://www.imsglobal.org/sites/default/files/xsd/ims_qtiasiv1p2p1.xsd");

XmlNode Title = Test.SelectSingleNode("//d:title[@title='SMALL TEST 1']");

答案 1 :(得分:0)

试着回答你的第二个问题,那就是评论,我会说,在你发布的代码上(请,下次使用编码框),在Test元素中,我认为,命名空间

https://www.imsglobal.org/sites/default/files/xsd/ims_qtiasiv1p2p1.xsd

所以,如果你要求&#34;标题&#34;测试元素,你不会得到你期望的,除非你先使用XmlNamespaceManager设置命名空间,然后

 //NameSpaceAssociatedString:title

使用SelectSingleNode

这是因为,xml方法需要某种方法在不同的命名空间之间找到相同的标记。

例如

<xsd xmlns="namespace1">
    <title title="SMALL TEST 1" ident="0">
</xsd>

<xsd xmlns="namespace2">
    <title title="SMALL TEST 1" ident="0">
</xsd>

PD: 您放在评论上的代码,它适用于.net 4.5 c#console app。不知道为什么它对你不起作用。

希望它有所帮助,
何塞
Moralzarzal - 马德里
西班牙