質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

3630閲覧

PowerShellで関数を作って、XMLのノードを引数にして要素にアクセスしたい

lin.ming

総合スコア50

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2021/12/13 01:56

編集2021/12/13 02:33

PowerShellにて

$xmlDoc = [XML](Get-Content c:\test.xml) $val = [string]$xmlDoc.root.parent.child.Attributes["name"].'#text'

で取得することはできました。
同様のことを何度もするので関数化したいです。

function ReadXmlAttr($file_path, $tag) { $xmlDoc = [XML](Get-Content $file_path) $val = [string]$xmlDoc.$tag.Attributes["name"].'#text' } ReadXmlAttr("c:\test.xml", "root.parent.child")

みたいなことをやりたいのですが、値を取得できません。
ノード名を変数で指定するのはできないのでしょうか?
ご教示お願いいたします。

XMLファイルは以下の感じです。

<root> <parent> <child name="hoge" /> </parent> </root>

環境は
OS : Windows 10
PowerShell : 5.1.18362.1801
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ReadXmlAttrはこれで動作すると思います。

function ReadXmlAttr($file_path, $tag) { $xmlDoc = [XML](Get-Content $file_path) foreach ($prop in $tag -split '.') { $xmlDoc = $xmlDoc.$prop } $xmlDoc.Attributes["name"].'#text' }

動作しなかったのはroot.parent.childというメンバーにアクセスしようとするコードになっているからです。

# powershellは.を含めたメンバーを扱える $foo=@{ bar=@{ hoge=10 } 'bar.hoge'=100 } $foo.bar # 10 $foo.'bar.hoge' # 100 # つまりこういうこと $tag = "root.parent.child" $xmlDoc.$tag # これは $xmlDoc.'root.parent.child' と解釈される → $null

ところで、PowerShellにはXPathを扱う関数もあります。

function ReadXmlAttr($file_path, $xpath) { (Select-Xml $xpath $file_path).Node.Attributes["name"].Value } ReadXmlAttr Temp:\temp.html /root/parent/child

Xpathは属性を直接取得できるので......

function ReadXmlAttr($file_path, $xpath) { (Select-Xml $xpath $file_path).Node.Value } ReadXmlAttr Temp:\temp.html /root/parent/child/@name ReadXmlAttr Temp:\temp.html //@name

イメージ説明

投稿2021/12/13 04:49

編集2021/12/13 12:50
SilkyFowl

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lin.ming

2021/12/13 07:02

ご教示ありがとうございます。 しかしながらまだ取得できません。 function ReadXmlAttr($file_path, $path) { (Select-Xml $xpath $file_path).Node.Value } ReadXmlAttr "c:\test\test.xml" "/root/parent/child/@name" とスクリプト書いたのですが、実行すると 「Select-Xml : パラメーター 'XPath の引数を確認できません。引数が null または空です。null または空でない引数を指定して、コマンドを再度実行してください。」 とエラー表示されます。 どうかお付き合いのほどよろしくお願いいたします。
lin.ming

2021/12/13 07:18

すみません、上記はケアレスミスでした。 「Select-Xml : ファイル 'c:\test\test.xml' を読み取れません。このドキュメントは既に 'DocumentElement' ノードがあります。」とエラー表示されます。
SilkyFowl

2021/12/13 12:52

すみません、そのエラーを再現できませんでした...... 回答にスクリーンショットを追加しました。参考になれば幸いです。
lin.ming

2021/12/14 00:59

ありがとうございます。 今日実行してみたら、なぜか正常に動きました。 実は本当にやりたいことは属性値の取得、変更、ファイルに保存なので、新たに質問立ち上げます。 そちらもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問