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

本文关键字:InnerText TextBox 不仅仅是 XML 节点 读取 | 更新日期: 2023-09-27 18:35:37

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

我正在制作一个 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只是返回一些错误。再次感谢大家的帮助!

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

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

这里的核心问题是,您的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']");

试图回答你的第二个问题,那就是关于评论,我会说,在您发布的代码上(请下次为此使用编码框架),在 Test 元素内,我假设有一个命名空间

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

因此,如果您请求测试的"title"元素,您将无法获得预期的内容,除非您首先使用 XmlNamespaceManager 设置命名空间,然后

 //NameSpaceAssociatedString:title

使用选择单节点

这是因为,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# 控制台应用程序下对我有用。不知道为什么它不适合你。

希望对您有所帮助,
何塞
莫拉尔扎尔扎尔 - 马德里
西班牙