2016-02-22 30 views
1

我一直在努力争取一个星期,因为我无法自己解决这个问题我请求你的帮助。阅读特定的XML节点(值,不只是InnerText),并把值在文本框

我正在制作一个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

我首先想到的:是您的XML节点''正确?它似乎没有被终止。也许它应该是'<title ... />'或'<title ...>'? ''也是一样。如果您发布了一个更完整的XML示例,可能会更好。 – Kjartan

+0

谢谢你的Kjartan :)但我确保你的xml已经正确完成了,这是一个很长的过程,所以我只发布了一些可以帮助我开始的特定部分,在我学会了如何之后,我会自己完成其余的工作。谢谢 ! – chering

回答

0

“..和我也没有设法找到如何导航到XML的特定节点”

的核心问题在这里,你的XML有默认命名空间

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

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

现在,访问元素的命名空间使用XPath,您需要在您的XPath正确使用XmlNamespaceManager,注册的前缀来引用您的XML默认命名空间,然后使用注册的前缀,这样的事情:

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']"); 
+0

har07非常感谢您的答复,我将不得不再次阅读它(有些术语不为我所知),您有更多的建议吗?非常感谢您的时间和关注! – chering

+0

我已经删除了命名空间。然后我试试: 'public string ShowPath {get;组; }(在OpenFileDialog之后放置文件位置) FileStream READER = new FileStream(ShowPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite); XDocument Test = XDocument.Load(ShowPath); Console.WriteLine(Test); XElement Title = Test.Element(“title”); Console.WriteLine(Title); ' 但是第二个Console.WL没有返回什么原因? – chering

+0

尝试使用'XElement Title = Test.Root.Element(“title”);'而不是 – har07

0

试着回答你的第二个问题,那就是在评论中,我会说,在你发布的代码上(请在下一次使用代码框架的时候),在Test元素内部,我假设有一个名称空间

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

因此,如果你要求测试的“称号”的元素,你不会得到你所期望的,除非你先设置的命名空间使用的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#控制台应用程序在为我工作。不知道为什么它不适合你。

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