Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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
需要在XML文件中插入子节点的帮助吗_Xml_Powershell - Fatal编程技术网

需要在XML文件中插入子节点的帮助吗

需要在XML文件中插入子节点的帮助吗,xml,powershell,Xml,Powershell,需要PowerShell中的帮助以更正XML文件。我要在此处插入的节点不是第一个子节点 XML文件的名称。 当前文件的结构-这是当前文件,我需要这方面的帮助 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" > <ShipmentNumber>0012546776

需要PowerShell中的帮助以更正XML文件。我要在此处插入的节点不是第一个子节点 XML文件的名称。 当前文件的结构-这是当前文件,我需要这方面的帮助

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
    <ShipmentNumber>0012546776</ShipmentNumber>
    <Container>Selleys/Yates</Container>
    <Extnl_id/>
    <AddressForwardingAgent>
        <PartnerNumber>0000400260</PartnerNumber>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST</Name>
        <HouseandStreet>TEST1</HouseandStreet>
        </AddressForwardingAgent>
    <AddressSender>
        <TransportPlanningPoint>4001</TransportPlanningPoint>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST2</Name>
        <HouseandStreet>TEST2</HouseandStreet>
    </AddressSender>
    <Consignment>
        <ConsignmentNumber>0001</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>2005.268</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>3.856</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
        <ConsignmentNumber>0002</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>21.12</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.044</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
        <ConsignmentNumber>0003</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
            <GrossWeight>12.45</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.056</TotalVolume>
            <VolumeUOM>P3</VolumeUOM>
        </ConsignmentHeader>
    </Consignment>

0012546776
塞利/耶茨
0000400260
EN
试验
测试1
4001
EN
测试2
测试2
0001
X
2005.268
公斤
3.856
M3
0002
X
21.12
公斤
0.044
M3
0003
Y
12.45
公斤
0.056
P3
预期输出-我希望使用PowerShell在XML中使用这种结构

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
    <ShipmentNumber>0012546776</ShipmentNumber>
    <Container>Selleys/Yates</Container>
    <Extnl_id/>
    <AddressForwardingAgent>
        <PartnerNumber>0000400260</PartnerNumber>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST</Name>
        <HouseandStreet>TEST1</HouseandStreet>
        </AddressForwardingAgent>
    <AddressSender>
        <TransportPlanningPoint>4001</TransportPlanningPoint>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST2</Name>
        <HouseandStreet>TEST2</HouseandStreet>
    </AddressSender>
    <Consignment>
    <ConsigmentLine>                 ## Need to insert this tag here
        <ConsignmentNumber>0001</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>2005.268</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>3.856</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
    </ConsigmentLine>
    <ConsigmentLine>    ## Need to insert this tag here
        <ConsignmentNumber>0002</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>21.12</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.044</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
    </ConsigmentLine>
    <ConsigmentLine>    ## Need to insert this tag here
        <ConsignmentNumber>0003</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
            <GrossWeight>12.45</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.056</TotalVolume>
            <VolumeUOM>P3</VolumeUOM>
        </ConsignmentHeader>
    </ConsigmentLine>
    </Consignment>

0012546776
塞利/耶茨
0000400260
EN
试验
测试1
4001
EN
测试2
测试2
##需要在这里插入这个标签吗
0001
X
2005.268
公斤
3.856
M3
##需要在这里插入这个标签吗
0002
X
21.12
公斤
0.044
M3
##需要在这里插入这个标签吗
0003
Y
12.45
公斤
0.056
P3

您需要首先捕获“寄售编号”和“寄售标头”节点,从xml中删除“寄售”节点并重新生成该节点

对于演示,我使用了一个Here字符串,但您可能需要使用
[xml]$xml=Get Content-Path'd:\MyCurrentXml.xml'

[xml]$xml = @"
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
    <ShipmentNumber>0012546776</ShipmentNumber>
    <Container>Selleys/Yates</Container>
    <Extnl_id/>
    <AddressForwardingAgent>
        <PartnerNumber>0000400260</PartnerNumber>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST</Name>
        <HouseandStreet>TEST1</HouseandStreet>
        </AddressForwardingAgent>
    <AddressSender>
        <TransportPlanningPoint>4001</TransportPlanningPoint>
        <LanguageKey>EN</LanguageKey>
        <Name>TEST2</Name>
        <HouseandStreet>TEST2</HouseandStreet>
    </AddressSender>
    <Consignment>
        <ConsignmentNumber>0001</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>2005.268</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>3.856</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
        <ConsignmentNumber>0002</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
            <GrossWeight>21.12</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.044</TotalVolume>
            <VolumeUOM>M3</VolumeUOM>
        </ConsignmentHeader>
        <ConsignmentNumber>0003</ConsignmentNumber>
        <ConsignmentHeader>
            <DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
            <GrossWeight>12.45</GrossWeight>
            <WeightUOM>KG</WeightUOM>
            <TotalVolume>0.056</TotalVolume>
            <VolumeUOM>P3</VolumeUOM>
        </ConsignmentHeader>
    </Consignment>
</Shipment>
"@
结果:


0012546776
塞利/耶茨
0000400260
EN
试验
测试1
4001
EN
测试2
测试2
0001
X
2005.268
公斤
3.856
M3
0002
X
21.12
公斤
0.044
M3
0003
Y
12.45
公斤
0.056
P3

另外,您的示例xml缺少最后的结束标记,您也可以尝试以下方法。我添加了一些注释来解释解决方案。还添加了XML文件末尾缺少的
结束标记

# Function to zip two arrays together using .NET LINQ
function Select-Zip {
    [CmdletBinding()]
    Param(
        $First,
        $Second,
        $ResultSelector = { ,$args }
    )

    [System.Linq.Enumerable]::Zip($First, $Second, [Func[Object, Object, Object[]]]$ResultSelector)
}

# Create XML object to load data into
$xml = New-Object -TypeName System.Xml.XmlDocument

# Load in XML file
$xml.Load("test.xml")

# Get root node where we make the changes
$consignmentRootNode = $xml.Shipment.Consignment

# Get both number and header nodes
$numberNodes = $consignmentRootNode.ConsignmentNumber
$headerNodes = $consignmentRootNode.ConsignmentHeader

# Zip above nodes to form number & header pairs
$zippedNodes = Select-Zip -First $numberNodes -Second $headerNodes

# Remove consignment root node
$xml.Shipment.RemoveChild($consignmentRootNode)

# Rebuild new consignment node 
$newConsignmentRootNode = $xml.CreateElement("Consignment")

# Iterate each pair
foreach ($pair in $zippedNodes)
{
    # Create new line node
    $consignmentLineNode = $xml.CreateElement("ConsigmentLine")

    # Build and append number node
    # Need to create a new one because number node is stored as a string
    $consignmentNumberNode = $xml.CreateElement("ConsignmentNumber")
    $consignmentNumberNode.InnerText = $pair[0]
    $consignmentLineNode.AppendChild($consignmentNumberNode)

    # Append header node
    $consignmentLineNode.AppendChild($pair[1])
    $newConsignmentRootNode.AppendChild($consignmentLineNode)
}

# Add rebuilt consignment node to shipment node
$xml.Shipment.AppendChild($newConsignmentRootNode)

# Save output to new file
# Don't want to corrupt original
$xml.Save("output.xml")
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
  <ShipmentNumber>0012546776</ShipmentNumber>
  <Container>Selleys/Yates</Container>
  <Extnl_id />
  <AddressForwardingAgent>
    <PartnerNumber>0000400260</PartnerNumber>
    <LanguageKey>EN</LanguageKey>
    <Name>TEST</Name>
    <HouseandStreet>TEST1</HouseandStreet>
  </AddressForwardingAgent>
  <AddressSender>
    <TransportPlanningPoint>4001</TransportPlanningPoint>
    <LanguageKey>EN</LanguageKey>
    <Name>TEST2</Name>
    <HouseandStreet>TEST2</HouseandStreet>
  </AddressSender>
  <Consignment>
    <ConsigmentLine>
      <ConsignmentNumber>0001</ConsignmentNumber>
      <ConsignmentHeader>
        <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
        <GrossWeight>2005.268</GrossWeight>
        <WeightUOM>KG</WeightUOM>
        <TotalVolume>3.856</TotalVolume>
        <VolumeUOM>M3</VolumeUOM>
      </ConsignmentHeader>
    </ConsigmentLine>
    <ConsigmentLine>
      <ConsignmentNumber>0002</ConsignmentNumber>
      <ConsignmentHeader>
        <DangerousGoodsIndicator>X</DangerousGoodsIndicator>
        <GrossWeight>21.12</GrossWeight>
        <WeightUOM>KG</WeightUOM>
        <TotalVolume>0.044</TotalVolume>
        <VolumeUOM>M3</VolumeUOM>
      </ConsignmentHeader>
    </ConsigmentLine>
    <ConsigmentLine>
      <ConsignmentNumber>0003</ConsignmentNumber>
      <ConsignmentHeader>
        <DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
        <GrossWeight>12.45</GrossWeight>
        <WeightUOM>KG</WeightUOM>
        <TotalVolume>0.056</TotalVolume>
        <VolumeUOM>P3</VolumeUOM>
      </ConsignmentHeader>
    </ConsigmentLine>
  </Consignment>
</Shipment>
# Function to zip two arrays together using .NET LINQ
function Select-Zip {
    [CmdletBinding()]
    Param(
        $First,
        $Second,
        $ResultSelector = { ,$args }
    )

    [System.Linq.Enumerable]::Zip($First, $Second, [Func[Object, Object, Object[]]]$ResultSelector)
}

# Create XML object to load data into
$xml = New-Object -TypeName System.Xml.XmlDocument

# Load in XML file
$xml.Load("test.xml")

# Get root node where we make the changes
$consignmentRootNode = $xml.Shipment.Consignment

# Get both number and header nodes
$numberNodes = $consignmentRootNode.ConsignmentNumber
$headerNodes = $consignmentRootNode.ConsignmentHeader

# Zip above nodes to form number & header pairs
$zippedNodes = Select-Zip -First $numberNodes -Second $headerNodes

# Remove consignment root node
$xml.Shipment.RemoveChild($consignmentRootNode)

# Rebuild new consignment node 
$newConsignmentRootNode = $xml.CreateElement("Consignment")

# Iterate each pair
foreach ($pair in $zippedNodes)
{
    # Create new line node
    $consignmentLineNode = $xml.CreateElement("ConsigmentLine")

    # Build and append number node
    # Need to create a new one because number node is stored as a string
    $consignmentNumberNode = $xml.CreateElement("ConsignmentNumber")
    $consignmentNumberNode.InnerText = $pair[0]
    $consignmentLineNode.AppendChild($consignmentNumberNode)

    # Append header node
    $consignmentLineNode.AppendChild($pair[1])
    $newConsignmentRootNode.AppendChild($consignmentLineNode)
}

# Add rebuilt consignment node to shipment node
$xml.Shipment.AppendChild($newConsignmentRootNode)

# Save output to new file
# Don't want to corrupt original
$xml.Save("output.xml")