我现在已经挣扎了一个星期,因为我无法独自解决这个问题,我请求你的帮助。
我正在制作一个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只返回一些错误。再次感谢大家的帮助!
答案 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 - 马德里
西班牙