2016-02-04 96 views
0

我试图对包含数千个节点的大型XML文件进行排序,并且为了排序所有节点的共同点,还有一个名为“ID”的属性。排序密集XML文件的节点

该属性之前的元素类型有所不同:它可以有多个名称,例如“Apt”,“CentreDrill”,“Reamer”,“Cylinder”,“Block”,“Model”,“Sweep”锥体“,”探针“和其他一些。这让我很难找出一种算法,可以进行正确的排序,而不管属性前的名称如何。

我不希望与outter元素的顺序混乱,那就是我想要的元素“参数米尔斯”“参数钻头”“工具架”“探头触笔“,”抛光器“保持相同的顺序。我想对内部元素进行排序,如下图所示。

Original XML in the native applicationSorted XML in the native application

原始XML内容:精简版(287线)

<?xml version="1.0"?> 
    <Tools> 
    <Tool ID="Parametric Mills" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>Milling</Type> 
     <Cutter> 
     <Apt ID="10000" ParentID="" Type="FLAT END" > 
      <D>12.7</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>63.5</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="2" ParentID="" Type="BALL END" > 
      <D>12.7</D> 
      <R>6.35</R> 
      <E>0</E> 
      <F>6.35</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="33" ParentID="" Type="TAPERED BULL NOSE" > 
      <D>12.7</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>5</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <ShankDiameter>12.7</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="3000" ParentID="" Type="BULL NOSE" > 
      <D>12.7</D> 
      <R>2</R> 
      <E>4.35</E> 
      <F>2</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-114.3</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Parametric Drills" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>HoleMaking</Type> 
     <Cutter> 
     <Apt ID="5000" ParentID="" Type="DRILL" > 
      <D>9.525</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>31</A> 
      <B>0</B> 
      <H>101.6</H> 
      <StickoutLength>76.2</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>63.5</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Reamer ID="111" ParentID="" DRILLMILL="FALSE" Type="Reamer" > 
      <ChamferLength>0.5</ChamferLength> 
      <D>12</D> 
      <H>100</H> 
      <ShankDiameter>12</ShankDiameter> 
      <StickoutLength>0</StickoutLength> 
      <SpindleDirection>CW</SpindleDirection> 
      <MAXIMUMMATERIALREMOVAL>0</MAXIMUMMATERIALREMOVAL> 
      <FluteLength>63.5</FluteLength> 
      <Alternate>off</Alternate> 
     </Reamer> 
     <CenterDrill ID="3" ParentID="" DRILLMILL="FALSE" Type="CenterDrill" > 
      <ChamferAngle>60</ChamferAngle> 
      <H>50</H> 
      <PilotAngle>31</PilotAngle> 
      <D>3</D> 
      <PilotLength>3</PilotLength> 
      <ShankDiameter>12</ShankDiameter> 
      <StickoutLength>0</StickoutLength> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>11.69552</FluteLength> 
      <Alternate>off</Alternate> 
     </CenterDrill> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-127</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Tool Holders" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>Turning</Type> 
     <Holder> 
     <Block ID="455" ParentID=""> 
      <Width>25.4</Width> 
      <Length>25.4</Length> 
      <Height>101.6</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Block> 
     <Cylinder ID="1" ParentID=""> 
      <Radius>50</Radius> 
      <Height>10</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Cylinder> 
     <Cone ID="50000" ParentID=""> 
      <ButtomRadius>30</ButtomRadius> 
      <TopRadius>10</TopRadius> 
      <Height>50</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Cone> 
     </Holder> 
    </Tool> 
    <Tool ID="Probe Stylus" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Type>Probing</Type> 
     <Cutter> 
     <Probe ID="11500" ParentID="" Type="Standard"> 
      <SphereDiameter>5.00126</SphereDiameter> 
      <Height>101.6</Height> 
      <StemDiameter>2.99974</StemDiameter> 
      <Length>101.6</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>76.2</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     <Probe ID="10455" ParentID="" Type="Cylinder"> 
      <SphereDiameter>10</SphereDiameter> 
      <Height>10</Height> 
      <StemDiameter>3</StemDiameter> 
      <Length>50</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>0</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     <Probe ID="11111" ParentID="" Type="Disk"> 
      <SphereDiameter>20</SphereDiameter> 
      <Height>3</Height> 
      <Height2>5</Height2> 
      <Diameter2>3</Diameter2> 
      <PinOffset>8</PinOffset> 
      <StemDiameter>6</StemDiameter> 
      <Length>50</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>0</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-127</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Polishers" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Type>Polisher</Type> 
     <Cutter> 
     <Apt ID="50" ParentID="" Type="FLAT END" PolishType="Polisher"> 
      <D>38.1</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>101.6</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="65" ParentID="" Type="BALL END" PolishType="Polisher"> 
      <D>20</D> 
      <R>10</R> 
      <E>0</E> 
      <F>10</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="42" ParentID="" Type="BULL NOSE" PolishType="Polisher"> 
      <D>10</D> 
      <R>2</R> 
      <E>3</E> 
      <F>2</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-114.3</Z> 
     </DrivenPoint> 
    </Tool> 
    </Tools> 

这是排序后的预期XML内容:

<?xml version="1.0"?> 
    <Tools> 
    <Tool ID="Parametric Mills" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>Milling</Type> 
     <Cutter> 
     <Apt ID="2" ParentID="" Type="BALL END" > 
      <D>12.7</D> 
      <R>6.35</R> 
      <E>0</E> 
      <F>6.35</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="33" ParentID="" Type="TAPERED BULL NOSE" > 
      <D>12.7</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>5</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <ShankDiameter>12.7</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="3000" ParentID="" Type="BULL NOSE" > 
      <D>12.7</D> 
      <R>2</R> 
      <E>4.35</E> 
      <F>2</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="10000" ParentID="" Type="FLAT END" > 
      <D>12.7</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>0</B> 
      <H>88.9</H> 
      <StickoutLength>63.5</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>50.8</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-114.3</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Parametric Drills" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>HoleMaking</Type> 
     <Cutter> 
     <CenterDrill ID="3" ParentID="" DRILLMILL="FALSE" Type="CenterDrill" > 
      <ChamferAngle>60</ChamferAngle> 
      <H>50</H> 
      <PilotAngle>31</PilotAngle> 
      <D>3</D> 
      <PilotLength>3</PilotLength> 
      <ShankDiameter>12</ShankDiameter> 
      <StickoutLength>0</StickoutLength> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>11.69552</FluteLength> 
      <Alternate>off</Alternate> 
     </CenterDrill> 
     <Reamer ID="111" ParentID="" DRILLMILL="FALSE" Type="Reamer" > 
      <ChamferLength>0.5</ChamferLength> 
      <D>12</D> 
      <H>100</H> 
      <ShankDiameter>12</ShankDiameter> 
      <StickoutLength>0</StickoutLength> 
      <SpindleDirection>CW</SpindleDirection> 
      <MAXIMUMMATERIALREMOVAL>0</MAXIMUMMATERIALREMOVAL> 
      <FluteLength>63.5</FluteLength> 
      <Alternate>off</Alternate> 
     </Reamer> 
     <Apt ID="5000" ParentID="" Type="DRILL" > 
      <D>9.525</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>31</A> 
      <B>0</B> 
      <H>101.6</H> 
      <StickoutLength>76.2</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>63.5</FluteLength> 
      <Alternate>off</Alternate> 
     </Apt> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-127</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Tool Holders" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Teeth>2</Teeth> 
     <Type>Turning</Type> 
     <Holder> 
     <Cylinder ID="1" ParentID=""> 
      <Radius>50</Radius> 
      <Height>10</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Cylinder> 
     <Block ID="455" ParentID=""> 
      <Width>25.4</Width> 
      <Length>25.4</Length> 
      <Height>101.6</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Block> 
     <Cone ID="50000" ParentID=""> 
      <ButtomRadius>30</ButtomRadius> 
      <TopRadius>10</TopRadius> 
      <Height>50</Height> 
      <NoSpin>0</NoSpin> 
      <Alternate>off</Alternate> 
     </Cone> 
     </Holder> 
    </Tool> 
    <Tool ID="Probe Stylus" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Type>Probing</Type> 
     <Cutter> 
     <Probe ID="10455" ParentID="" Type="Cylinder"> 
      <SphereDiameter>10</SphereDiameter> 
      <Height>10</Height> 
      <StemDiameter>3</StemDiameter> 
      <Length>50</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>0</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     <Probe ID="11111" ParentID="" Type="Disk"> 
      <SphereDiameter>20</SphereDiameter> 
      <Height>3</Height> 
      <Height2>5</Height2> 
      <Diameter2>3</Diameter2> 
      <PinOffset>8</PinOffset> 
      <StemDiameter>6</StemDiameter> 
      <Length>50</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>0</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     <Probe ID="11500" ParentID="" Type="Standard"> 
      <SphereDiameter>5.00126</SphereDiameter> 
      <Height>101.6</Height> 
      <StemDiameter>2.99974</StemDiameter> 
      <Length>101.6</Length> 
      <MaxRPM>0</MaxRPM> 
      <StemRGB>-4144960</StemRGB> 
      <StickoutLength>76.2</StickoutLength> 
      <Alternate>off</Alternate> 
     </Probe> 
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-127</Z> 
     </DrivenPoint> 
    </Tool> 
    <Tool ID="Polishers" Units="Millimeter" Stack="FALSE"> 
     <Force_data Input_lead="0" lead_dis="0.000000" helix_angle="0.000000" radial_rake="0.000000" rake_ball="0.000000" force_method="0" material="0" edge_type="0" 
    feed_limit="0.000000" chip_thickness="0.000000" force_limit="0.000000" power_limit="0.000000" plunge_feed="0" start_angle="0.000000" feed_drop="0.000000" cutoutput="0" force_resolution="0" force_resolution_distance="0.000000" 
      force_unit="1" force_cutchannel="0" force_ccstartangle="0.000000" force_ccfeedrop="0.000000" force_minfeedChange="0.000000" force_minfeedChange_def="1" force_mincutfeedrate="0.000000" 
      force_mincutfeedrate_def="1" force_aircutfeedrate="0.000000" force_aircutfeedrate_def="1" force_toolType="" force_edgeMaterial=""/> 
     <Type>Polisher</Type> 
     <Cutter> 
     <Apt ID="42" ParentID="" Type="BULL NOSE" PolishType="Polisher"> 
      <D>10</D> 
      <R>2</R> 
      <E>3</E> 
      <F>2</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="50" ParentID="" Type="FLAT END" PolishType="Polisher"> 
      <D>38.1</D> 
      <R>0</R> 
      <E>0</E> 
      <F>0</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>101.6</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt> 
     <Apt ID="65" ParentID="" Type="BALL END" PolishType="Polisher"> 
      <D>20</D> 
      <R>10</R> 
      <E>0</E> 
      <F>10</F> 
      <A>0</A> 
      <B>0</B> 
      <H>127</H> 
      <StickoutLength>0</StickoutLength> 
      <R2>0</R2> 
      <E2>0</E2> 
      <F2>0</F2> 
      <SpindleDirection>CW</SpindleDirection> 
      <FluteLength>76.2</FluteLength> 
      <ShankDiameter>19.05</ShankDiameter> 
      <Alternate>off</Alternate> 
     </Apt>   
     </Cutter> 
     <DrivenPoint ID="1"> 
     <Type>-1</Type> 
     <Radius>0</Radius> 
     <X>0</X> 
     <Y>0</Y> 
     <Z>-114.3</Z> 
     </DrivenPoint> 
    </Tool> 
    </Tools> 

这是我正在使用的代码,但输出文件是bei ng作为单行返回 XML文件...我有点迷失了关于如何在标签“Apt”,“CenterDrill”,“Reamer”,“Cylinder”之后对包含ID属性的节点进行排序。 “块”,“型号”,“流水不腐”,“锥”,“探头”和其他几个人而不包含由“工具”“DrivenPoint”标签之前的ID属性节点搞乱/节点。

我对这个解决方案进行了很多研究和搜索,但它们似乎都基于更简单的XML结构......我不介意为每种节点类型编写代码,下面在我的代码中尝试做一些与“探针”节点,但它不工作或者...我得到一个1kb的输出文件,其中只有一行...

有什么建议吗?

Imports System 
Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Xml 
Imports System.Xml.Linq 

Public Class Form1 

    Private Function ReorderByMaterialThickness(ByRef inFile As String, ByRef outFile As String) 

     Try 
      Dim document As XElement = XElement.Load(inFile) 

      Dim sortedTables As XElement() = document.Elements("Probe").OrderBy(Function(t) CInt(t.Element("ID"))).ToArray() 
      document.ReplaceAll(sortedTables) 
      document.Save(outFile) 
     Catch ex As Exception 
      MsgBox("Something went wrong!") 
     End Try 

     Return Nothing 
    End Function 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     ReorderByMaterialThickness("C:\Testes\Original.xml", "C:\Testes\Sorted.xml") 
    End Sub 
End Class 
+2

如何使用专用于XML的技术?理想情况下,XSLT。 –

+0

如果有人能指出我正确的方向,我很乐意学习它。目前我无法知道如何使用它... –

+1

您可以尝试将此问题变成XSLT问题,而不是使用'xslt'来标记它。但之前:确保在这里包含一个最小的,完整的输入和输出文档样本,而不是链接和许多代码行。帮助:http://stackoverflow.com/help/mcve。请记住:我不知道vb.net中是否有简单的解决方案 - 可能会有一个。 –

回答

2

好吧,评论有很多,但我没有注意到,直到我回来,但我相信这是做你想要的。它只对具有2个或更多祖先的元素进行排序,所以我相信它只是针对带有ID的“内部”元素并对它们进行排序。当我用你的原始XML进行试用时,我得到了你说的你想要的输出。

XDocument doc = XDocument.Load("Original.xml"); 
    foreach (XElement el in doc.Root.Descendants().Where(x => x.Elements().Any(y => y.Attribute("ID") != null) && x.Ancestors().Count() >= 2)) 
    { 
     el.ReplaceNodes(el.Elements().OrderBy(x => int.Parse(x.Attribute("ID").Value))); 
    } 
    doc.Save("newFile.xml"); 

我对你的文章有点困惑,但我认为这是你要求的。

如果你不想使用的XDocument:

XElement doc = XElement.Load("Original.xml"); 
    foreach (XElement el in doc.Descendants().Where(x => x.Elements().Any(y => y.Attribute("ID") != null) && x.Ancestors().Count() >= 2)) 
    { 
     el.ReplaceNodes(el.Elements().OrderBy(x => int.Parse(x.Attribute("ID").Value))); 
    } 
    doc.Save("newFile.xml"); 
+0

它几乎奏效!但是,你的代码搞乱了节点

+0

你是什么意思? – golgothan3

+0

对不起,我认为原始xml会在多行中打破节点,因为它非常长,当我们用代码输出它时,它会写入一行。我犯了一个错误,这并不是说你的代码搞乱了源代码,它只是把它写在一行中。我的错。 –

2

AFAICT,应用以下XSL转换到XML文件会产生所需的结果:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Cutter | Holder"> 
    <xsl:copy> 
     <xsl:apply-templates> 
      <xsl:sort select="@ID" data-type="number" order="ascending"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

演示:http://xsltransform.net/ncdD7mT

+1

哦,这篇文章是如此的丰富!我会在xslt中尝试一下......我认为它对我来说很重要,以便学习它! –

+0

迈克尔,我在你分享的模拟器中试过......看起来很完美!我必须学习xls! –