Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net 无法反序列化XML文件_.net_Xml_Vb.net_Deserialization - Fatal编程技术网

.net 无法反序列化XML文件

.net 无法反序列化XML文件,.net,xml,vb.net,deserialization,.net,Xml,Vb.net,Deserialization,我正在尝试将XML文件反序列化为.net对象。我担心文件的格式可能不正确(无论多么可疑)。该文件可以包含多个具有子组集合的组。我认为我构建的类与XML文件的类相匹配。下面是反序列化XML的类和代码 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim export As XMLExport Dim serializer As New System.Xml.Ser

我正在尝试将XML文件反序列化为.net对象。我担心文件的格式可能不正确(无论多么可疑)。该文件可以包含多个具有子组集合的组。我认为我构建的类与XML文件的类相匹配。下面是反序列化XML的类和代码

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim export As XMLExport

    Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(XMLExport))
    Dim fn As New FileStream("C:\temp\TEST_AP_20190426_040000.xml", FileMode.Open)
    export = serializer.Deserialize(fn)
    fn.Close()
End Sub

<XmlRoot("XMLExport")>
Public Class XMLExport
    <XmlElement("VoucherHeader")>
    Public Vouchers() As VoucherHeader
End Class

Public Class VoucherHeader
    <XmlElement("VoucherKey")> Public VoucherKey As String
    <XmlElement("VouchNo")> Public VoucherNo As String
    <XmlElement("VoucherTranNo")> Public VoucherTranNo As String
    <XmlElement("VoucherTranDate")> Public VoucherTranDate As Date
    <XmlElement("VoucherHdrCmnt")> Public VoucherHdrCmnt As String
    <XmlElement("VoucherTranAmt")> Public VoucherTranAmt As Double

    <XmlElement("VoucherDetail")>
    Public VoucherDetails() As VoucherDetail
End Class

Public Class VoucherDetail
    <XmlElement("VoucherLineGLAcctNo")> Public VoucherLineGLAcctNo As String
    <XmlElement("VoucherLineAmt")> Public VoucherLineAmt As String
    <XmlElement("ApplyFromTranID")> Public ApplyFromTranID As String
    <XmlElement("ApplyFromTranDate")> Public ApplyFromTranDate As String
    <XmlElement("CheckMemos")> Public CheckMemos As String
    <XmlElement("PmtAmt")> Public PmtAmount As String
    <XmlElement("VoucherLineKey")> Public VoucherLineKey As String
    <XmlElement("VoucherLineDistKey")> Public VoucherLineDistKey As String
    <XmlElement("ApplyToVoucherKey")> Public ApplyToVoucherKey As String
    <XmlElement("EntryNo")> Public EntryNo As String
End Class
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim导出为XMLExport
Dim序列化程序作为新的System.Xml.Serialization.XmlSerializer(GetType(XMLExport))
将fn变为新文件流(“C:\temp\TEST\u AP\u 20190426\u 040000.xml”,FileMode.Open)
export=序列化程序。反序列化(fn)
fn.Close()
端接头
公共类XMLExport
作为凭证头的公共凭证()
末级
公共类凭证头
作为字符串的公共VoucherKey
作为字符串的公共voucheno
公共VoucherTranNo As字符串
公共凭证日期为日期
作为字符串的公共凭证hdrcmnt
公共发票金额为双倍
公共VoucherDetails()作为VoucherDetail
末级
公共类凭证详细信息
公共VoucherLineGLAcctNo作为字符串
公共VoucherLineAmt作为字符串
公共ApplyFromTranID作为字符串
公共ApplyFromTranDate作为字符串
作为字符串的公共检查备忘录
公共PmtAmount作为字符串
作为字符串的公共VoucherLineKey
公共VoucherLineDistKey作为字符串
公共ApplyToVoucherKey作为字符串
作为字符串的公共入口号
末级
我可以接收的XML示例如下所示:

<?xml version="1.0"?>
<XMLExport>
    <VoucherHeader>
    <VoucherKey>1242550</VoucherKey>
    <VouchNo>0000000976</VouchNo>
    <VoucherTranNo>15W030B041619</VoucherTranNo>
    <VoucherTranDate>2019-04-16T00:00:00</VoucherTranDate>
    <VoucherHdrCmnt>Acct 26-05-39-6922 1</VoucherHdrCmnt>
    <VoucherTranAmt>44.090</VoucherTranAmt>
    <VoucherDetail>
        <VoucherLineGLAcctNo>72100</VoucherLineGLAcctNo>
        <VoucherLineAmt>44.090</VoucherLineAmt>
        <ApplyFromTranID>0000001906-CK</ApplyFromTranID>
        <ApplyFromTranDate>2019-04-25T00:00:00</ApplyFromTranDate>
        <CheckMemos>Acct 26-05-39-6922 1</CheckMemos>
        <PmtAmt>444.090</PmtAmt>
        <VoucherLineKey>1734668</VoucherLineKey>
        <VoucherLineDistKey>1734670</VoucherLineDistKey>
        <ApplyToVoucherKey>12344</ApplyToVoucherKey>
        <EntryNo>1</EntryNo>
    </VoucherDetail>
    <VoucherDetail>
        <VoucherLineGLAcctNo>72100</VoucherLineGLAcctNo>
        <VoucherLineAmt>44.090</VoucherLineAmt>
        <ApplyFromTranID>0000001906-CK</ApplyFromTranID>
        <ApplyFromTranDate>2019-04-25T00:00:00</ApplyFromTranDate>
        <CheckMemos>Acct 26-05-39-6922 1</CheckMemos>
        <PmtAmt>46.090</PmtAmt>
        <VoucherLineKey>1734368</VoucherLineKey>
        <VoucherLineDistKey>1734670</VoucherLineDistKey>
        <ApplyToVoucherKey>1242550</ApplyToVoucherKey>
        <EntryNo>1</EntryNo>
    </VoucherDetail>
    <VoucherDetail>
        <VoucherLineGLAcctNo>72100</VoucherLineGLAcctNo>
        <VoucherLineAmt>44.090</VoucherLineAmt>
        <ApplyFromTranID>0000001906-CK</ApplyFromTranID>
        <ApplyFromTranDate>2019-04-25T00:00:00</ApplyFromTranDate>
        <CheckMemos>Acct 43436922 1</CheckMemos>
        <PmtAmt>44.090</PmtAmt>
        <VoucherLineKey>1734668</VoucherLineKey>
        <VoucherLineDistKey>1734670</VoucherLineDistKey>
        <ApplyToVoucherKey>1242550</ApplyToVoucherKey>
        <EntryNo>1</EntryNo>
    </VoucherDetail>
    </VoucherHeader>
    <VoucherHeader>
        <VoucherKey>1242552</VoucherKey>
        <VouchNo>0000000977</VouchNo>
        <VoucherTranNo>14483</VoucherTranNo>
        <VoucherTranDate>2019-04-11T00:00:00</VoucherTranDate>
        <VoucherHdrCmnt>Cust 2449 Spring 2019 Inspection</VoucherHdrCmnt>
        <VoucherTranAmt>975.000</VoucherTranAmt>
        <VoucherDetail>
            <VoucherLineGLAcctNo>70200</VoucherLineGLAcctNo>
            <VoucherLineAmt>975.000</VoucherLineAmt>
            <ApplyFromTranID>0000001905-CK</ApplyFromTranID>
            <ApplyFromTranDate>2019-04-25T00:00:00</ApplyFromTranDate>
            <CheckMemos>Cust 2449</CheckMemos>
            <PmtAmt>975.000</PmtAmt>
            <VoucherLineKey>1734669</VoucherLineKey>
            <VoucherLineDistKey>1734671</VoucherLineDistKey>
            <ApplyToVoucherKey>1242552</ApplyToVoucherKey>
            <EntryNo>1</EntryNo>
        </VoucherDetail>
    </VoucherHeader>
    <VoucherHeader>
        <VoucherKey>1242553</VoucherKey>
        <VouchNo>0000000978</VouchNo>
        <VoucherTranNo>354112</VoucherTranNo>
        <VoucherTranDate>2019-04-15T00:00:00</VoucherTranDate>
        <VoucherHdrCmnt>Cust 3238</VoucherHdrCmnt>
        <VoucherTranAmt>135.000</VoucherTranAmt>
        <VoucherDetail>
            <VoucherLineGLAcctNo>70500</VoucherLineGLAcctNo>
            <VoucherLineAmt>135.000</VoucherLineAmt>
            <ApplyFromTranID>0000001904-CK</ApplyFromTranID>
            <ApplyFromTranDate>2019-04-25T00:00:00</ApplyFromTranDate>
            <CheckMemos>Cust 3238</CheckMemos>
            <PmtAmt>135.000</PmtAmt>
            <VoucherLineKey>1734695</VoucherLineKey>
            <VoucherLineDistKey>1734697</VoucherLineDistKey>
            <ApplyToVoucherKey>1242553</ApplyToVoucherKey>
            <EntryNo>1</EntryNo>
        </VoucherDetail>
    </VoucherHeader>
</XMLExport>

1242550
0000000976
15W030B041619
2019-04-16T00:00:00
会计科目26-05-39-6922 1
44.090
72100
44.090
000000 1906-CK
2019-04-25T00:00:00
会计科目26-05-39-6922 1
444.090
1734668
1734670
12344
1.
72100
44.090
000000 1906-CK
2019-04-25T00:00:00
会计科目26-05-39-6922 1
46.090
1734368
1734670
1242550
1.
72100
44.090
000000 1906-CK
2019-04-25T00:00:00
会计436922 1
44.090
1734668
1734670
1242550
1.
1242552
0000000977
14483
2019-04-11T00:00:00
Cust 2449 2019年春季检查
975
70200
975
000000 1905-CK
2019-04-25T00:00:00
客户2449
975
1734669
1734671
1242552
1.
1242553
0000000978
354112
2019-04-15T00:00:00
客户3238
135
70500
135
000000 1904-CK
2019-04-25T00:00:00
客户3238
135
1734695
1734697
1242553
1.
我希望遍历“凭证”集合,因为可以有多个凭证头,在每个凭证头中,遍历凭证详细信息

我试图更改类、项等上的XML装饰,但现在代码将在
序列化程序上失败。反序列化(fn)
行出现以下异常:

XMLReader.exe中发生类型为“System.InvalidCastException”的未处理异常
其他信息:
无法将“XMLReader.XMLExport”类型的对象强制转换为“XMLReader.XMLExport[]”类型


您需要进行以下更改:

(1)根元素未定义为数组的容器。将声明更改为对
XMLExport
的单个引用

Dim export As XMLExport
(2)
XmlRoot
将在应用它的地方被忽略。它唯一会产生影响的地方是
XMLExport
类,因为它是文档的根。名称与类匹配,因此没有区别。只有在不更改元素名称的情况下,希望类名具有灵活性时,这才很重要

(3)使用
XmlElement
代替
XmlArray
XmlArrayItem
。序列化程序已经知道它是一个数组。只有
xmlement
,它将使用该元素名称作为元素的内联列表,而不是单个父元素中的元素

<XmlRoot("XMLExport")>
Public Class XMLExport
    <XmlElement("VoucherHeader")>
    Public Vouchers() As VoucherHeader
End Class

您需要进行以下更改:

(1)根元素未定义为数组的容器。将声明更改为对
XMLExport
的单个引用

Dim export As XMLExport
(2)
XmlRoot
将在应用它的地方被忽略。它唯一会产生影响的地方是
XMLExport
类,因为它是文档的根。名称与类匹配,因此没有区别。只有在不更改元素名称的情况下,希望类名具有灵活性时,这才很重要

(3)使用
XmlElement
代替
XmlArray
XmlArrayItem
。序列化程序已经知道它是一个数组。只有
xmlement
,它将使用该元素名称作为元素的内联列表,而不是单个父元素中的元素

<XmlRoot("XMLExport")>
Public Class XMLExport
    <XmlElement("VoucherHeader")>
    Public Vouchers() As VoucherHeader
End Class

这与C无关,你是对的,我删除了标记。抱歉-我会用C或vb编写代码。netThis与C无关。你是对的,我删除了标记。抱歉-我会用C或vb编写代码。netThanks是在构建类时出现的复制粘贴错误。我按照你的建议进行了更改,并在我的帖子中更新了代码。我现在收到一个异常:XML文档中有一个错误(2,2)。我有点担心给我的XML文件的格式…或者我的类仍然有问题