我们有将 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>
将 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>