2017-02-24 5 views
0

私は以下のようにこのXML構造を持っています。 "Zipcode:"のプロパティ値を持つオブジェクトブロックを見つけて、その前にOrderIDの値を2行、実際の郵便番号の値を持つ次の行を取得する必要があります。複数のプロパティタグからプロパティ名と値を抽出します

最終結果は、私は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" 
    } 
} 

答えて

2

これは、望ましい値を得る1つの方法です。 '郵便番号を:':まず、 'FieldCaption' の値が等しいObject要素を探し

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

そのObjectから、あなたは簡単に相対的なXPath式を使用してname属性によってProperty要素を取得することができます:

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

出力:

λ echo $orderID.value, $zipcode.value 
Smith-123 
05403 
関連する問題