Vb.net 使用(名称、值)元素数未知的XML的自定义类层次结构
我试图在另一个结构中定义一个结构数组,但遇到了挑战。 基本上,我应该使用一个xml节点,如下所示:Vb.net 使用(名称、值)元素数未知的XML的自定义类层次结构,vb.net,xml-parsing,Vb.net,Xml Parsing,我试图在另一个结构中定义一个结构数组,但遇到了挑战。 基本上,我应该使用一个xml节点,如下所示: <additionalData> <nameValuePair> <name>amount</name> <value>10</value> </nameValuePair> <nameValuePair> <name>billerId<
<additionalData>
<nameValuePair>
<name>amount</name>
<value>10</value>
</nameValuePair>
<nameValuePair>
<name>billerId</name>
<value>4665890107880063161</value>
</nameValuePair>
<nameValuePair>
<name>billNumber</name>
<value>12434829</value>
</nameValuePair>
</additionalData>
数量
10
比勒里德
4665890107880063161
帐单号码
12434829
我需要将nameValuePair定义为父结构additionalData中的结构数组。包含键值对的数据结构是一个数组。如果您不需要特定的订单,您可以使用它
Dim additionalData As New Dictionary(Of String, String)()
additionalData.Add("myname", "myvalue")
如果您的项目按特定顺序排列,您可以使用List
Dim additionalData As New List(Of KeyValuePair(Of String, String))()
Dim additionalDataItem As New KeyValuePair(Of String, String)("myname", "myvalue")
additionalData.Add(additionalDataItem)
编辑:
struct Transaction
{
public Dictionary<string, string> additionalData;
}
Transaction transaction;
transaction.additionalData = new Dictionary<string, string>();
transaction.additionalData.Add("amount", "10");
struct事务
{
公共字典附加数据;
}
交易;
transaction.additionalData=新字典();
交易。额外数据。添加(“金额”,“10”);
检查下面的代码,这里的lst
可能就是您要查找的结构:
Dim xml As XElement = <additionalData>
<nameValuePair>
<name>amount</name>
<value>10</value>
</nameValuePair>
<nameValuePair>
<name>billerId</name>
<value>4665890107880063161</value>
</nameValuePair>
<nameValuePair>
<name>billNumber</name>
<value>12434829</value>
</nameValuePair>
</additionalData>
Dim lst As New List(Of KeyValuePair(Of String, String))
For Each nameValuePair As XElement In xml.Elements
Dim name As String = nameValuePair.<name>.Value
Dim value As String = nameValuePair.<value>.Value
lst.Add(New KeyValuePair(Of String, String)(name, value))
Next
您可以将上述代码更改为:
Dim lst As New AdditionalData(xml) 'xml is inline XML file declared above
或者在您的情况下,可能是:
Dim lst As New AdditionalData(XDocument.Load("path_to_xml").Root)
我故意让它接受XElement,这样您可以传递内联XML或解析的XML(从流或其他方式)或从磁盘加载。如果它是一个复杂的结构,并且
附加数据
是其中的一部分,您甚至可以为它提供XML文件的子集。感谢您的回复。。。我已将nameValuePair声明为一个名为mynameValuePair的结构,并带有名称和值,希望在另一个结构additionalData中调用它,该结构在另一个名为transaction@mooker请格式化并将此代码作为问题的一部分发布。我犯了一个错误,我实际上应该在API中使用XML。问题在于我当前的实现additionalData在调用API@mooker:请相应地更新您的问题。它仍然说生成一个xml节点
,这与您刚才说的相反。使用列表(nameValuePair),而不是数组。列表可以包含任意数量的项。感谢您的代码片段,但是在您的示例中,您已经声明并分配了变量xml,然后循环提取值。我的挑战是实现一个需要这样一个xml的类。可以从实现一个API的角度来考虑,该API期望使用这种xml布局进行调用。@mooker:那么问题出在哪里?在期望XML文件为XDocument或XElement的其他数据中创建构造函数。然后使用XDocument.Parse或XDocument.Load馈送,如果接受XElement,则传递XDocument.Root。逻辑是一样的。我展示了内联XML的示例,因为您可以将其复制到空项目中并在那里使用它。这就是所谓的简化测试用例。我实现了上述建议(自定义类),但现在它抱怨“mynameValuePair无法序列化,因为它没有无参数构造函数”,当我添加无参数构造函数时,它会引发另一个异常“Count=(Count))引发了System.TypeLoadException类型的异常。“@mooker:是否尝试将此自定义类写入XML文件?阅读时,只需像我上面建议的那样传递一个XML文档。您可以将其视为自定义序列化代码。在任何情况下,我都可以看看你的代码-请在下面的回答中发布。谢谢。经过几次修改后,你的建议解决了我的问题
Dim lst As New AdditionalData(XDocument.Load("path_to_xml").Root)