首页 > 解决方案 > 将现有 XML 文件中的节点附加到新的 XML 文档中

问题描述

我目前正在为我正在使用的一些 XML 文件开发版本控制功能。基本工作流程是,在解析 XML 文件时,将其按 Order 分解,然后放入数据库表中,然后根据最新版本的 XML 提取并重新组合成我可以使用的对象。

这是一个订单看起来像 XML 的示例(您可以略过这个 - 这正是我正在使用的):

<Order IsEmpty="N">
  <OrderNum>13903899</OrderNum>
  <AmtUOM>US$</AmtUOM>
  <CompanyUnit>Y</CompanyUnit>
  <CreatedBy>PenskeTruckLeasing</CreatedBy>
  <Opened>05/01/2018</Opened>
  <Priority>5</Priority>
  <ShopID>DE PERE</ShopID>
  <TaxOverride>F</TaxOverride>
  <UnitID>892</UnitID>
  <Vendor>64657200-7542</Vendor>
  <NonCompUnitID />
  <InvOrder IsEmpty="N">
    <InvType>REPAIR</InvType>
    <PONum>7542-136815</PONum>
  </InvOrder>
  <RepOrder IsEmpty="N">
    <RepSite>FACILITY</RepSite>
    <RepClass>NONSCHEDULED</RepClass>
    <Opened>05/01/2018</Opened>
    <Closed>05/02/2018</Closed>
  </RepOrder>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>001</SystemCode>
    <AssemblyCode>001</AssemblyCode>
    <PartCode>219</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>001</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>AC FILTER</PTLComplaint>
    <PTLCause>PLUGGED</PTLCause>
    <PTLCorrection>REPLACE FILTER AIR CONDITIONER</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>AC FILTER;AIR CONDITIONING, HEATING   VENTILATING SYSTEM;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>14.99</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>001</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>219</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>001</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>AIR FILTER PANEL</Descrip>
      <Hours>0</Hours>
      <LineTotal>14.99</LineTotal>
      <LineType>PART</LineType>
      <Mechanic />
      <PartID>AF55777</PartID>
      <QtyReqd>1.0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>31.02</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>001</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>219</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>001</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>31.02</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>1.37</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>001</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>219</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>001</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SALES TAX</Descrip>
      <Hours />
      <LineTotal>1.37</LineTotal>
      <LineType>TAX</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>1</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>002</SystemCode>
    <AssemblyCode>010</AssemblyCode>
    <PartCode>055</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>002</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>MIRROR SWITCH</PTLComplaint>
    <PTLCause>FAILED</PTLCause>
    <PTLCorrection>REPLACE MIRROR POWER DIRECTIONAL CONTROL SWITCH</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>MIRROR SWITCH;CAB   SHEET METAL;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>43.51</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>010</AssemblyCode>
      <PartCode>055</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SWITCH,MOTOR,REMOTE CONTR...</Descrip>
      <Hours>0</Hours>
      <LineTotal>43.51</LineTotal>
      <LineType>PART</LineType>
      <Mechanic />
      <PartID>DTL 15829700</PartID>
      <QtyReqd>1.0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>38.77</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>010</AssemblyCode>
      <PartCode>055</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>38.77</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>3.98</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>010</AssemblyCode>
      <PartCode>055</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SALES TAX</Descrip>
      <Hours />
      <LineTotal>3.98</LineTotal>
      <LineType>TAX</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>1</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>002</SystemCode>
    <AssemblyCode>035</AssemblyCode>
    <PartCode>015</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>002</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>WIPERS</PTLComplaint>
    <PTLCause>STREAK</PTLCause>
    <PTLCorrection>REPLACE WINDSHIELD WIPER BLADE</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>WIPERS;CAB   SHEET METAL;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>3.36</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>035</AssemblyCode>
      <PartCode>015</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>BLADE,WIPER</Descrip>
      <Hours>0</Hours>
      <LineTotal>6.72</LineTotal>
      <LineType>PART</LineType>
      <Mechanic />
      <PartID>ABP N82 7622</PartID>
      <QtyReqd>2.0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>23.26</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>035</AssemblyCode>
      <PartCode>015</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>23.26</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>.61</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>035</AssemblyCode>
      <PartCode>015</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SALES TAX</Descrip>
      <Hours />
      <LineTotal>.61</LineTotal>
      <LineType>TAX</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>1</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>002</SystemCode>
    <AssemblyCode>042</AssemblyCode>
    <PartCode>001</PartCode>
    <WorkAccomplishedCode>024</WorkAccomplishedCode>
    <CompCode>002</CompCode>
    <ActionCode>15</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>DECK PLATE</PTLComplaint>
    <PTLCause>LOSE</PTLCause>
    <PTLCorrection>REPAIR DECK PLATE/CROSSWALK AND MOUNTING BRACKETS</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>DECK PLATE;REPAIR DECK PLATE/CROSSWALK AND MOUNTING BRACKETS;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>77.54</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>002</SystemCode>
      <AssemblyCode>042</AssemblyCode>
      <PartCode>001</PartCode>
      <WorkAccomplishedCode>024</WorkAccomplishedCode>
      <CompCode>002</CompCode>
      <ActionCode>15</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>.50</Hours>
      <LineTotal>38.77</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>017</SystemCode>
    <AssemblyCode>001</AssemblyCode>
    <PartCode>020</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>017</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>LEFT REAR DRIVE TIRE</PTLComplaint>
    <PTLCause>MISSING TREAD SECTION</PTLCause>
    <PTLCorrection>REPLACE DRIVE TIRE(S)-3RD AXLE LEFT</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>LEFT REAR DRIVE TIRE;REAR TIRES;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>46.52</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>017</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>020</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>017</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>46.52</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>034</SystemCode>
    <AssemblyCode>004</AssemblyCode>
    <PartCode>021</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>034</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>BACK UP LIGHT</PTLComplaint>
    <PTLCause>BLOWN</PTLCause>
    <PTLCorrection>REPLACE CLEARANCE/MARKER LIGHT CAB AND CHASSIS ONLY-REAR RT</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>BACK UP LIGHT;LIGHTING SYSTEM;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>31.02</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>034</SystemCode>
      <AssemblyCode>004</AssemblyCode>
      <PartCode>021</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>034</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>31.02</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>.33</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>034</SystemCode>
      <AssemblyCode>004</AssemblyCode>
      <PartCode>021</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>034</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SALES TAX</Descrip>
      <Hours />
      <LineTotal>.33</LineTotal>
      <LineType>TAX</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>1</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>3.59</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>034</SystemCode>
      <AssemblyCode>004</AssemblyCode>
      <PartCode>021</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>034</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LAMP,BACKUP</Descrip>
      <Hours>0</Hours>
      <LineTotal>3.59</LineTotal>
      <LineType>PART</LineType>
      <Mechanic />
      <PartID>TL  40204</PartID>
      <QtyReqd>1.0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>041</SystemCode>
    <AssemblyCode>001</AssemblyCode>
    <PartCode>005</PartCode>
    <WorkAccomplishedCode>003</WorkAccomplishedCode>
    <CompCode>041</CompCode>
    <ActionCode>10</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>LOW POWER</PTLComplaint>
    <PTLCause>FILTER</PTLCause>
    <PTLCorrection>COMPLETE AF - REPLACE AIR FILTER MAIN ENGINE (INCLUDES BOTH ON M2'S)</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>LOW POWER;AIR INTAKE SYSTEM;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>57.70</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>041</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>005</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>041</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>FILTER,ELEMENT,AIR FILTER</Descrip>
      <Hours>0</Hours>
      <LineTotal>57.70</LineTotal>
      <LineType>PART</LineType>
      <Mechanic />
      <PartID>AF27879</PartID>
      <QtyReqd>1.0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>31.02</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>041</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>005</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>041</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>1</Hours>
      <LineTotal>31.02</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>5.28</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>041</SystemCode>
      <AssemblyCode>001</AssemblyCode>
      <PartCode>005</PartCode>
      <WorkAccomplishedCode>003</WorkAccomplishedCode>
      <CompCode>041</CompCode>
      <ActionCode>10</ActionCode>
      <Descrip>SALES TAX</Descrip>
      <Hours />
      <LineTotal>5.28</LineTotal>
      <LineType>TAX</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>1</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
  <OrderSec IsEmpty="N">
    <Billable>Y</Billable>
    <SystemCode>053</SystemCode>
    <AssemblyCode>004</AssemblyCode>
    <PartCode>001</PartCode>
    <WorkAccomplishedCode>013</WorkAccomplishedCode>
    <CompCode>053</CompCode>
    <ActionCode>95</ActionCode>
    <Complaint>PM</Complaint>
    <CompltDate>05/02/2018 07:56:38 </CompltDate>
    <PTLComplaint>CAMPAIGN</PTLComplaint>
    <PTLCause>REQUIRED</PTLCause>
    <PTLCorrection>COMPLETE OTH KIDDE CAMPAIGN - BUL#50-117 - REPLACE FIRE EXTINGUISHER</PTLCorrection>
    <DelReason />
    <ExtWarranty>N</ExtWarranty>
    <Opened>05/01/2018 11:39:06 </Opened>
    <Priority>5</Priority>
    <RepReason>PM</RepReason>
    <SecComment>CAMPAIGN;EXPENDABLES;INV#:0013903899</SecComment>
    <SectionNum />
    <TaxOverride />
    <WarrType />
    <OrderLine IsEmpty="N">
      <AdditType />
      <AfterMarket />
      <ChgAmt>77.50</ChgAmt>
      <ChgCateg>STANDARD</ChgCateg>
      <ChgDate>05/02/2018 07:56:38 </ChgDate>
      <ChgUOM>US$</ChgUOM>
      <SystemCode>053</SystemCode>
      <AssemblyCode>004</AssemblyCode>
      <PartCode>001</PartCode>
      <WorkAccomplishedCode>013</WorkAccomplishedCode>
      <CompCode>053</CompCode>
      <ActionCode>95</ActionCode>
      <Descrip>LABOR</Descrip>
      <Hours>.10</Hours>
      <LineTotal>7.75</LineTotal>
      <LineType>LABOR</LineType>
      <Mechanic />
      <PartID />
      <QtyReqd>0</QtyReqd>
      <QtyUOM />
      <Taxable />
      <TaxAmt />
      <VendorLine />
    </OrderLine>
  </OrderSec>
</Order>

现在,一个典型的订单包含大约 60 个这样的部分。长话短说,我需要从这些部分中重新组合 XML。

到目前为止,我已经创建了 xml 对象并创建了第一个节点(这些只是该文件中的一个),它是一个 VendorInvoice。

# new xml
[xml]$Newxml = New-Object System.Xml.XmlDocument
$newxml.LoadXml("<?xml version=`"1.0`" encoding=`"us-ascii`"?><VendorInvoices></VendorInvoices>")

我需要将这些订单中的每一个附加到 VendorInvoice 到 VendorInvoice 节点,我在这里尝试这样做:

foreach($VendorInvoice in $xml.VendorInvoices)
{
    foreach($Order in $VendorInvoices.Order)
    {
        $newxml.AppendChild($Order.OuterXml)
        $newxml.Save($Newxml)
    }
}

但是,这样做似乎不会在 VendorInvoices 节点下填充任何内容:

xml                               VendorInvoices
---                               --------------
version="1.0" encoding="us-ascii" 

有谁知道我要去哪里错了?这个过程需要我从 XML 文件中删除大量内容,但这是我必须构建 XML 文件的第一个实例。

如果需要,我可以提供更多信息。

标签: xmlpowershell

解决方案


这是一个简化输入的工作示例:

# The input document.
[xml] $xml = @'
<VendorInvoices>
  <Order>
    <OrderNum>1</OrderNum>
  </Order>
  <Order>
    <OrderNum>2</OrderNum>
  </Order>
</VendorInvoices>
'@

# Create the target XML document.
# Add a <dummy /> child element to <VendorVoices>, so we
# can get a reference to child element <VendorVoices> with dot notation below.
[xml] $newXml = @'
<?xml version="1.0" encoding="us-ascii"?>
<VendorInvoices><dummy/></VendorInvoices>
'@

# Get a referene to the new document's <VendorInvoices> element.
$newVendorInvoices = $newXml.VendorInvoices
$newVendorInvoices.Removeall() # Remove the dummy child node.

# Loop over all <Order> child elements of the original document's
# <VendorInvoices> element and add them to the target document's
# <VendorInvoices> element.
foreach ($order in $xml.VendorInvoices.Order) {
  # Import the order at hand into the new document and append it to the
  # <VendorInvoices> element. Note: .AppendChild() modifies the document in-place
  # and *also returns* the new child node; we assign to $null to suppress this output.
  $null = $newVendorInvoices.AppendChild($newXml.ImportNode($order, $true))
}

# Use Format-Custom to print a quick-and-dirty visualization of the document. 
# If you want to save the document to a new file, use, e.g., $newXml.Save("$PWD/new.xml")
$newXml | Format-Custom

以上产生:

class XmlDocument
{
  xml = version="1.0" encoding="us-ascii"
  VendorInvoices = 
    class XmlElement
    {
      Order = 
        [
          class XmlElement
          {
            OrderNum = 1
          }
          class XmlElement
          {
            OrderNum = 2
          }
        ]

    }
}

至于你尝试了什么:

  • 您的内部循环有一个错字:$VendorInvoices应该是$VendorInvoice.

  • 您错误地尝试附加$Order到目标文档的(文档)元素而不是子元素<VendorInvoices>

  • 使用- 期望实例 - 将现有元素的.OuterXml属性值 - a -附加到不同的元素不起作用。[string].AppendChild()[System.Xml.XmlNode]

  • $newXml.Save($newXml)毫无意义:内存中的DOM 操作不需要保存操作,如果要保存到文件,则必须指定输出文件路径;事实上,它的字符串化$newXml- 这是字符串文字'System.Xml.XmlDocument'- 在这里被解释为输出文件名。


推荐阅读