2017-08-22 15 views
0

こんにちは以下は、私が作業しているサンプルXMLファイル形式です。小さな部分でファイルを分割したいと思います。問題は2子ノード「ヘッダ」と「レコード」があるということであり、私はここで、「ヘッダー」&「フッター」ノードVBAを使用して大きなXMLファイルを小さなものに分割する方法

<PortfolioBulk2_0_RES> 
    <Header> 
    <ProviderCode>123</ProviderCode> 
    <FileID>20170817</FileID> 
    <NumInputSubjects>23123</NumInputSubjects> 
    <ChunkID>1</ChunkID> 
    <RecordMin>1</RecordMin> 
    <RecordMax>23123</RecordMax> 
    </Header> 
    <Record> 
    <RecordId>1</RecordId> 
    <ProviderSubjectNo>123456789</ProviderSubjectNo> 
    <PackageLabel>GOLD</PackageLabel> 
    <Error> 
     <No>811</No> 
     <Description>Subject not found</Description> 
    </Error> 
    </Record> 
    <Record> 
    <RecordId>2</RecordId> 
    <ProviderSubjectNo>654789321</ProviderSubjectNo> 
    <PackageLabel>GOLD</PackageLabel> 
    <Error> 
     <No>811</No> 
     <Description>Subject not found</Description> 
    </Error> 
    </Record> 
    <Footer> 
    <StartDateTime>2008201712:18:06</StartDateTime> 
    <StopDateTime>2008201717:19:00</StopDateTime> 
    <NoIndividualsOK>13185</NoIndividualsOK> 
    <NoCompaniesOK>546</NoCompaniesOK> 
    <NoIndividualsError>282</NoIndividualsError> 
    <NoCompaniesError>20</NoCompaniesError> 
    <NoUnknownsError>9090</NoUnknownsError> 
    </Footer> 
</PortfolioBulk2_0_RES> 

を使用してXMLファイルを保存することができませんVBAで私のコードです。 XML形式で保存された各ファイルでヘッダーとフッターのノードをループする方法を誰かが示唆してくれることを願っています。おかげ

Sub SPLIT() 
numFiles = 2 'number of output files 

Set src = CreateObject("Msxml2.DOMDocument.6.0") 
src.async = False 
src.Load "C:\Users\104704\Documents\Office 1\04_Raw Data\09_AECB Bulk\CLI working\01.xml" 

Set Nodes = src.SelectNodes("//Record") 
numnodes = Nodes.Length \ numFiles 'number of nodes per output file 
'MsgBox (numnodes) 

Set XML = Nothing 
For i = 0 To Nodes.Length - 1 
    'create a new XML object on the first iteration and every time numNodes 
    'nodes have been added to the current object 
    If i Mod numnodes = 0 Then 
    If Not XML Is Nothing Then 
     'if we already have an XML object: save it to a file 
     Set prolog = XML.createProcessingInstruction("xml", "version='1.0'") 
     XML.InsertBefore prolog, XML.ChildNodes(0) 
     XML.Save "C:\Users\104704\Documents\Office 1\04_Raw Data\09_AECB Bulk\CLI working\" & (i \ numnodes - 1) & ".xml" 
    End If 
    Set XML = CreateObject("Msxml2.DOMDocument.6.0") 
    Set root = XML.createElement("PortfolioBulk2_0_RES") 

    XML.appendChild root 

    End If 

    root.appendChild Nodes.Item(i) 
Next 
'save unsaved XML object 
If Not XML Is Nothing Then 
    Set prolog = XML.createProcessingInstruction("xml", "version='1.0'") 
    XML.InsertBefore prolog, XML.ChildNodes(0) 
    XML.Save "C:\Users\104704\Documents\Office 1\04_Raw Data\09_AECB Bulk\CLI working\" & (i \ numnodes - 1) & ".xml" 
End If 
End Sub 
+0

「整形」xmlファイルは、XMLを使用して1個のルートタグ、だから、ネットライブラリ内のほとんどのメソッドを持っている唯一のルートタグを可能にします。多くの場合、xmlがログファイルで使用されると、ログメッセージがファイルに追加されるため、ログファイルは整形されていないため、オープンおよびクローズルートタグがないため、ファイルが整形されません。したがって、ファイルに複数のルートタグが含まれるようにするには、StreamWriterを使用してファイルを保存します。 – jdweng

+0

@ O.Cheema、既存のすべてのレコードノードを新しいXMLにエクスポートしますか?もしそうなら、私の答えはどうですか? –

答えて

-2

のXML LINQにO.Cheema @

Imports System.Xml 
Imports System.Xml.Linq 
Imports System.IO 
Module Module1 
    Const INPUT_FILE As String = "c:\temp\test.xml" 
    Const OUTPUT_FILE As String = "c:\temp\test1.xml" 
    Sub Main() 
     Dim doc As XDocument = XDocument.Load(INPUT_FILE) 
     Dim headersAndFooters As List(Of XElement) = doc.Descendants().Where(Function(x) (x.Name.LocalName = "Header") Or (x.Name.LocalName = "Footer")).ToList() 

     Dim writer As New StreamWriter(OUTPUT_FILE) 

     For Each headerAndFooter In headersAndFooters 
      writer.WriteLine(headerAndFooter.ToString()) 
     Next 
     writer.Flush() 
     writer.Close() 
    End Sub 

End Module 
+0

これはVBAですか? –

+0

いいえ、それはVB.NETです – FunThomas

+0

質問は、Excel VBA –

0

を使用して、次の試みは、私の知る限り理解されるように、新しいXMLに既存の記録ノードをエクスポートします。以下のコードは純粋VBAで、XMLDOMを使用しています。

Option Explicit 
Dim src As Object 
Dim XML As Object 

Sub Split2() 
    Dim myNodes As Object    ' node list 
    Dim nd  As Object    ' single node 
    Dim myClone As Object    ' copy of source node 
    Dim i  As Integer 
    Dim numNodes As Integer 
    Dim numFiles As Integer: numFiles = 2 ' Output files 
' wanted as root in target 
    Dim tag  As String: tag = "PortfolioBulk2_0_RES" 
' xml object can be defined and loaded via expression 
    Dim sTarget As String 
    sTarget = "<?xml version=""1.0"" encoding=""utf-8""?><" & tag & ">" & vbCrLf & "</" & tag & ">" 
' 1. SOURCE 
' set socure file to memory 
    Set src = CreateObject("Msxml2.DOMDocument.6.0") 
    src.aSync = False 
' Load source file (physically) 
    src.Load ThisWorkbook.Path & "\data\unsplitted.xml" 
' 2. TARGET 
' set target to memory 
    Set XML = CreateObject("Msxml2.DOMDocument.6.0") 
    XML.aSync = False 
' Load target STRING via LoadXML method 
    XML.LoadXML sTarget 
' ------------------------------- 
' define node list in source file 
' ------------------------------- 
    Set myNodes = src.DocumentElement.SelectNodes("Record") 
    numNodes = myNodes.Length \ numFiles 'number of nodes per output file 
    MsgBox (numNodes) 

    For Each nd In myNodes 
     i = i + 1 
    ' ----------------- 
    ' clone source node 
    ' ----------------- 
     Set myClone = nd 
    ' add to target as sub node under root tag 
     XML.DocumentElement.appendchild myClone 

    Next nd 
    ' ----------------- 
    ' Save target 
    ' ----------------- 
    XML.Save ThisWorkbook.Path & "\data\splitted(" & (i \ numNodes - 1) & ").xml" 

End Sub 
関連する問題