Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用(名称、值)元素数未知的XML的自定义类层次结构_Vb.net_Xml Parsing - Fatal编程技术网

Vb.net 使用(名称、值)元素数未知的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<

我试图在另一个结构中定义一个结构数组,但遇到了挑战。 基本上,我应该使用一个xml节点,如下所示:

<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)