我想将.xml文件中的银行对帐单转换为对眼睛更友好的.csv文件。
.xml文件具有如此多的节点和子节点,我似乎无法找到如何读取节点内部的许多子层的信息。
我需要为此使用带有VB.net的Visual Studio 2012。
我已经尝试了几个示例,但是作为一个新手,我真的无法使其工作。
感谢所有的建议!
编辑:
嗨!我已经准备好要发布的示例了,但是不知何故忘了将其粘贴到我的帖子中...
示例XML银行对帐单:
<Document
xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<BkToCstmrStmt>
<GrpHdr>
<MsgId>MSGSTMT1234567890123457890</MsgId>
<CreDtTm>2019-02-13T17:17:18.2369252+01:00</CreDtTm>
</GrpHdr>
<Stmt>
<Id>SKBSTMT5/2019-EUR</Id>
<LglSeqNb>20195</LglSeqNb>
<CreDtTm>2019-01-01T00:00:00</CreDtTm>
<Acct>
<Id>
<IBAN>DE012345678901234</IBAN>
</Id>
<Ownr>
<Nm>COMPANY NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
<AdrLine>ADDRESS 1</AdrLine>
<AdrLine>ADDRESS 2</AdrLine>
</PstlAdr>
</Ownr>
<Svcr>
<FinInstnId>
<BIC>BICCODE</BIC>
<Nm>BANK NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
</PstlAdr>
</FinInstnId>
</Svcr>
</Acct>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>OPBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">11000.10</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2019-01-01</Dt>
</Dt>
</Bal>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>CLBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">1000.10</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2019-01-01</Dt>
</Dt>
</Bal>
<TxsSummry>
<TtlCdtNtries>
<NbOfNtries>2</NbOfNtries>
<Sum>11000.10</Sum>
</TtlCdtNtries>
<TtlDbtNtries>
<NbOfNtries>12</NbOfNtries>
<Sum>11111.11</Sum>
</TtlDbtNtries>
</TxsSummry>
<Ntry>
<Amt Ccy="EUR">11.11</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2019-01-01</Dt>
</BookgDt>
<ValDt>
<Dt>2019-01-01</Dt>
</ValDt>
<AcctSvcrRef>111111111111</AcctSvcrRef>
<BkTxCd>
<Prtry>
<Cd>PP03</Cd>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<InstrId>12345678901</InstrId>
<EndToEndId>NOTPROVIDED</EndToEndId>
<TxId>1234567890123456</TxId>
</Refs>
<RltdPties>
<Dbtr>
<Nm>DEBITOR NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE012345678901234</IBAN>
</Id>
</DbtrAcct>
<Cdtr>
<Nm>CREDITOR NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE098765432109874</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<BIC>BICCODE</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>BICCODE</BIC>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<Purp>
<Prtry>OTHR</Prtry>
</Purp>
<RmtInf>
<Ustrd>PAYMENT</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">2000.20</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2019-01-02</Dt>
</BookgDt>
<ValDt>
<Dt>2019-01-02</Dt>
</ValDt>
<AcctSvcrRef>9876543210</AcctSvcrRef>
<BkTxCd>
<Prtry>
<Cd>US03</Cd>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<InstrId>987654321</InstrId>
<EndToEndId>DE987654</EndToEndId>
<TxId>898765432109876543210</TxId>
</Refs>
<RltdPties>
<Dbtr>
<Nm>DEBITOR NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
</PstlAdr>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE098765432109874</IBAN>
</Id>
</DbtrAcct>
<Cdtr>
<Nm>CREDITOR NAME</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
<AdrLine>ADDRESS 3</AdrLine>
<AdrLine>ADDRESS 4</AdrLine>
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE12345678901234</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<BIC>BICCODE</BIC>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<BIC>BICCODE</BIC>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<Purp>
<Prtry>PRCP</Prtry>
</Purp>
<RmtInf>
<Strd>
<CdtrRefInf>
<Tp>
<CdOrPrtry>
<Cd>SCOR</Cd>
</CdOrPrtry>
</Tp>
<Ref>123446789</Ref>
</CdtrRefInf>
<AddtlRmtInf>PAYMENT INFO</AddtlRmtInf>
</Strd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
</Stmt>
</BkToCstmrStmt>
</Document>
使用RobertBaron的建议和以下代码,我能够从xml文件中获取一些信息。
If element.Name.LocalName.ToString() = "EndToEndId" Then
My.Computer.FileSystem.WriteAllText("C:\cvs.csv", element.Value.ToString & ", ", True)
End If
在简单的xml文件中效果很好。
但是,如何找到更深嵌入节点结构中的数据?
例如,我将如何:
隐藏在结构内部的凭据银行帐号(iban):
<Document xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
<BkToCstmrStmt>
<Stmt>
<Ntry>
<NtryDtls>
<TxDtls>
<CdtrAcct>
<Id>
<IBAN>
感谢您的输入!
答案 0 :(得分:0)
这会让您入门。将XML文件加载到内存中,然后使用LINQ选择所需的节点。
Imports System.Xml
Imports System.Xml.Linq
Module Module1
Sub Main()
Dim doc As XDocument = XDocument.Load("test.xml")
Dim elements As IEnumerable(Of XElement)
' Select all nodes in the XML file.
elements = doc.Descendants()
' Select only leaf nodes.
elements = doc.Descendants.Where(Function(element) element.HasElements = False)
' etc...
' Loop through selected nodes, and write to .csv the values you want.
For Each element As XElement In elements
Debug.WriteLine(element.Name.LocalName + ": " + If(element.Value = Nothing, "", element.Value))
Next
End Sub
End Module