从多个属性标记中提取属性名称和值

问题描述:

我拥有如下所示的XML结构。我需要找到属性值为“Zipcode:”的对象块,并获取前两行的OrderID值和下一行具有实际邮政编码值的行。从多个属性标记中提取属性名称和值

最终结果是我需要OrderID值和邮编对(Smith-123,05403)。

<Object name="CustomDataList" type="TDM_List_CustomData"> 
    <List name="Items"> 
    <Object type="TDM_Item_CustomData"> 
     <Property name="CustomDataID" value="CD156FC1461C674F2CAFC181013FCB9822" /> 
     <Property name="OrderID" value="Smith-123" /> 
     <Property name="FieldID" value="{CCC2CBB8-BEAA-4E9B-AF2D-3E32B68821D0}" /> 
     <Property name="FieldCaption" value="" /> 
     <Property name="Value" value="35082_Site20" /> 
     <Property name="Kind" value="cdkInternal" /> 
    </Object> 
    <Object type="TDM_Item_CustomData"> 
     <Property name="CustomDataID" value="CD58AFECE84FF24D53AFB5E2F0411EE3C9" /> 
     <Property name="OrderID" value="Smith-123" /> 
     <Property name="FieldID" value="DS_CustomizableFieldZB99" /> 
     <Property name="FieldCaption" value="Zipcode:" /> 
     <Property name="Value" value="05403" /> 
     <Property name="Kind" value="cdkPublic" /> 
    </Object> 
    <Object type="TDM_Item_CustomData"> 
     <Property name="CustomDataID" value="CD5E584899B6274F88B05D459863006914" /> 
     <Property name="OrderID" value="Smith-123" /> 
     <Property name="FieldID" value="{62D7C382-9754-454D-A4D5-04437BFC5FE4}" /> 
     <Property name="FieldCaption" value="" /> 
     <Property name="Value" value="False" /> 
     <Property name="Kind" value="cdkInternal" /> 
    </Object> 

下面我有,我以前用在我一直在寻找在一行上只有一个属性名值对一些非常初级的代码,但我无法弄清楚如何前后阅读我行“邮编”指针。

Get-ChildItem C:\temp\pwrshell\*\*.xml | foreach { 
    echo $_.FullName 

    [xml]$doc = Get-Content $_ 
    $OrderID = $doc.SelectSingleNode("//Property[@name = 'OrderID']") 

    if ($OrderID) { 
     echo "OrderID: $($OrderID.value)" 
    } else { 
     echo "OrderID not found" 
    } 
} 

这是获得所需值的一种可能方式。首先,找到Object元素,其中 'FieldCaption' 值等于 '邮编:':

$orderID = $zipcodeObj.SelectSingleNode("Property[@name = 'OrderID']/@value") 
$zipcode = $zipcodeObj.SelectSingleNode("Property[@name = 'Value']/@value") 

$query = "//Object[Property[@name = 'FieldCaption' and @value = 'Zipcode:']]" 
$zipcodeObj = $doc.SelectSingleNode($query) 

从这个Object,那么你可以很容易地通过name属性使用相对XPath表达式得到Property元素输出:

λ echo $orderID.value, $zipcode.value 
Smith-123 
05403