PowerShellのXMLの理解に少し助けが必要です。 私はこのようないくつかのXMLファイルを持っている:PowerShellで名前空間を使用してXMLを解析する
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.example.com/xml/catalog/2006-10-31">
<product product-id="11210">
...
<available-flag>true</available-flag>
<online-flag>false</online-flag>
<online-flag site-id="ru">true</online-flag>
<online-flag site-id="fr">true</online-flag>
<online-flag site-id="uk">false</online-flag>
<online-flag site-id="de">true</online-flag>
...
</product>
<product product-id="50610">
...
<available-flag>true</available-flag>
<online-flag>true</online-flag>
<online-flag site-id="ru">false</online-flag>
<online-flag site-id="fr">true</online-flag>
<online-flag site-id="uk">false</online-flag>
<online-flag site-id="de">fasle</online-flag>
...
</product>
<product product-id="82929">
...
<available-flag>true</available-flag>
<online-flag>true</online-flag>
<online-flag site-id="ru">false</online-flag>
<online-flag site-id="fr">true</online-flag>
<online-flag site-id="uk">false</online-flag>
<online-flag site-id="de">true</online-flag>
...
</product>
</catalog>
私はPowerShellで二つの要素の値を取得する必要があります。
<online-flag>
(site-id
属性を持たない)<online-flag site-id="ru">
製品の場合はproduct-id="50610"
です。
私は、次のコードを持っている:私は必要な製品のノードを選択することができています。このコードで
:
$Path = "C:\Temp\0\2017-08-12_190211.xml" $XPath = "/ns:catalog/ns:product[@product-id='50610']" $files = Get-ChildItem $Path | Where {-not $_.PSIsContainer} if ($files -eq $null) { return } foreach ($file in $files) { [xml]$xml = Get-Content $file $namespace = $xml.DocumentElement.NamespaceURI $ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable) $ns.AddNamespace("ns", $namespace) $product = $xml.SelectSingleNode($XPath, $ns) }
いくつかの質問を。 PowerShellは示しています
online-flag : {true, online-flag, online-flag, online-flag...}
しかし、どのように、私は必要な
online-flag
要素(それが可能であれば両方の方法:のXPath 1とオブジェクト1)の値を選択することができますか?「オブジェクト」の方法でノードを選択することはできますか?私はいくつかのファイル、ファイル名を選択するための最良の方法は何か、グローバルなオンライン・フラグ(属性なし)、特定のオンライン・フラグを持っている場合は
$product = $xml.catalog.product | Where-Object {$_."product-id".value -eq "50610"}
:このような?
こんにちはアンスガー!ご回答有難うございます。私は既にドット表記法が機能していると言いました。それは便利ではないと私は同意します。あなたの例の問題は、私のXMLファイルが非常に大きく、2つのノードを選択するのに時間がかかるということです。私の例のように最初に製品を選択してから、XPathを使ってオンラインフラグ要素の値を選択することは可能ですか?この場合、XPathはどのようになりますか? – Alterant
$ product.SelectSingleNode( "/ ns:product/ns:online-flag [@ site-id = 'ru']"、$ ns)、 $ product.SelectSingleNode( " /製品名/オンラインフラグ[@ site-id = 'ru']」)、 $ /SSS/NOS:オンラインフラグ[@ site-id = 'ru']」、 $ product.SelectSingleNode product.SelectSingleNode( "/ online-flag [@ site-id = 'ru']")。 この$製品。GetElementsByTagName( "online-flag")は動作します。しかし結果は単なる値ではなく、値のリストです。 – Alterant
ここで答えが見つかりました:https://stackoverflow.com/questions/2238201/xmlnode-selectsinglenode-returns-element-outside-current – Alterant