XML 转换为特定 XML 模式

问题描述 投票:0回答:1

我们有将 XML 报告输出转换为特定格式的特定要求。

下面是需要转换为所需输出格式的XML。所有员工 ID 都应位于一个标签下 -

例如:如果我有 10 个员工 ID,我想显示

enh:ExpensesBenefits 
标签下的所有员工。

XML:

<wd:Report_Data xmlns:wd="urn:com.workday.report/Report_Example"> 
    <wd:Report_Entry>     
       <wd:Employee_ID>12345</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
       <wd:Employee_ID> 12346</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
       <wd:Employee_ID> 12347</wd:Employee_ID>
    </wd:Report_Entry>
</wd:Report_Data>

所需的 XML 输出格式 -

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:enh="http://www.ros.ie/schemas/paye-employers/err/v1/enhanced_reporting/">
    <soap:Body>
        <enh:EnhancedReportingSubmissionRequest>
            <enh:SubmissionID>Sub01</enh:SubmissionID>
            <enh:Header>
                <enh:Version>5.4.0</enh:Version>
            </enh:Header>
            <enh:ExpensesBenefits>
                <enh:EmploymentID>12345</enh:EmploymentID>
            </enh:ExpensesBenefits>
        </enh:EnhancedReportingSubmissionRequest>
    </soap:Body>
</soap:Envelope>
xml xslt
1个回答
0
投票

将 Powershell 脚本与 Xml Linq 结合使用

using assembly System.Xml.Linq 

$inputFilename = 'c:\temp\test.xml'
$outputFilename = 'c:\temp\test1.xml'
$submissionID = 'Sub01'
$version = '5.4.0'

$template = @"
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:enh="http://www.ros.ie/schemas/paye-employers/err/v1/enhanced_reporting/">
    <soap:Body>
        <enh:EnhancedReportingSubmissionRequest>
        </enh:EnhancedReportingSubmissionRequest>
    </soap:Body>
</soap:Envelope>
"@

$inDoc = [System.Xml.Linq.XDocument]::Load($inputFilename)
$outDoc = [System.Xml.Linq.XDocument]::Parse($template)

$envelope = $outDoc.Root
$enhNs = $envelope.GetNamespaceOfPrefix('enh')
$request = $outDoc.Descendants($enhNs + 'EnhancedReportingSubmissionRequest').Foreach([System.Xml.Linq.XElement])[0]

$reportData = $inDoc.Root
$wdNs = $reportData.GetNamespaceOfPrefix('wd')
$ids = $inDoc.Descendants($wdNs + 'Employee_ID') | foreach{ $_.Value.Trim()}

$xSubmissionID = [System.Xml.Linq.XElement]::new($enhNs + [System.Xml.Linq.XName]::Get('EnhancedReportingSubmissionRequest'), $submissionID)
$request.Add($xSubmissionID)

$header = [System.Xml.Linq.XElement]::new($enhNs + [System.Xml.Linq.XName]::Get('Header'))

$version = [System.Xml.Linq.XElement]::new($enhNs + [System.Xml.Linq.XName]::Get('Version'), $version)
$header.Add($version)

$request.Add($header)

$expensesBenefits = [System.Xml.Linq.XElement]::new($enhNs + [System.Xml.Linq.XName]::Get('ExpensesBenefits'))
$request.Add($expensesBenefits)


foreach($id in $ids)
{
   $employee_ID = [System.Xml.Linq.XElement]::new($enhNs + [System.Xml.Linq.XName]::Get('Employee_ID'), $id)
   $expensesBenefits.Add($employee_ID)
}

$outDoc.Save($outputFilename)

结果

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:enh="http://www.ros.ie/schemas/paye-employers/err/v1/enhanced_reporting/">
  <soap:Body>
    <enh:EnhancedReportingSubmissionRequest>
      <enh:EnhancedReportingSubmissionRequest>Sub01</enh:EnhancedReportingSubmissionRequest>
      <enh:Header>
        <enh:Version>5.4.0</enh:Version>
      </enh:Header>
      <enh:ExpensesBenefits>
        <enh:Employee_ID>12345</enh:Employee_ID>
        <enh:Employee_ID>12346</enh:Employee_ID>
        <enh:Employee_ID>12347</enh:Employee_ID>
      </enh:ExpensesBenefits>
    </enh:EnhancedReportingSubmissionRequest>
  </soap:Body>
</soap:Envelope>
© www.soinside.com 2019 - 2024. All rights reserved.