一部の属性が欠落している場合にXMLをオブジェクトに変換するにはどうすればよいですか?

イアン・サミュエル・マクリーン長老

問題

場所のXMLリストをオブジェクトのセットに変換しようとしています。

XMLファイルには、場所ごとに1つのLocation要素があります。XML属性には、オブジェクトのプロパティ値が含まれています。

一部のターゲットプロパティの名前をソース属性とは異なるものにしたい。

後でオブジェクトをCSVファイルにシリアル化したいので、プロパティの順序が重要です。

これは、問題を説明するための2つの場所のサンプルです。

[xml] $InputXml = @'
<?xml version="1.0" encoding="UTF-8"?>

<CTLocations xmlns="http://www.cartrawler.com/">
<Country code="AL" name="Albania" continent="Europe">
<Location Id="7188" Name="Tirana Airport" Lat="41.42108838" Lng="19.71271276" CountryCode="AL" Address="Tirana Airport Muhamet Gjollesha Str., Muhamet Gjollesha Str., Tirana" CityName="Tirana" Airport="1" AirportCode="TIA" RailwayStation="0"/>
<Location Id="30768" Name="Tirana Downtown" Lat="41.332" Lng="19.832" CountryCode="AL" Address="Rruga E Durresit. Nr 61, Tirana" CityName="Tirana" Airport="0" RailwayStation="0"/>
</Country>
</CTLocations>
'@

部分的な解決策

私のソリューションは、属性の完全なセットを持つ要素に対して機能しますが、属性のいずれかが欠落していると失敗します。

私が使用しているセレクト-XMLの重要な要素を選択するために、コマンドレットを、そしてPSCustomObject注文し、名前を変更したプロパティを持つオブジェクトを作成します。

Select-Xml -Xml $InputXml -XPath '//ns:Location' -Namespace @{ns = 'http://www.cartrawler.com/'} |
% {
  $n = $_.Node

  [PSCustomObject] @{
    LocationCode = $n.Id
    LocationName = $n.Name
    Latitude = $n.Lat
    Longitude = $n.Lng
    CountryCode = $n.CountryCode
    FormattedAddress = $n.Address
    CityName = $n.CityName
    ServesAirport = $n.Airport
    AirportCode = $n.AirportCode
    ServesRailwayStation = $n.RailwayStation
  }
}

厳密モードの結果

strict-modeを設定した場合:

Set-StrictMode -Version 3.0

最初の要素にはすべての属性が含まれているため、オブジェクトに変換されます。

LocationCode         : 7188
LocationName         : Tirana Airport
Latitude             : 41.42108838
Longitude            : 19.71271276
CountryCode          : AL
FormattedAddress     : Tirana Airport Muhamet Gjollesha Str., Muhamet Gjollesha Str., Tirana
CityName             : Tirana
ServesAirport        : 1
AirportCode          : TIA
ServesRailwayStation : 0

2番目の要素にはAirportCode属性がないため、PowerShellは代わりに例外を発生させます。

Property 'AirportCode' cannot be found on this object. Make sure that it exists.
At line:16 char:3
+   [PSCustomObject] @{
+   ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

無制限モードの結果

ストリクトモードをオフにすると:

Set-StrictMode -Off

PowerShellは、両方の場所をオブジェクトに変換します。欠落しているプロパティはnullです:

LocationCode         : 7188
LocationName         : Tirana Airport
Latitude             : 41.42108838
Longitude            : 19.71271276
CountryCode          : AL
FormattedAddress     : Tirana Airport Muhamet Gjollesha Str., Muhamet Gjollesha Str., Tirana
CityName             : Tirana
ServesAirport        : 1
AirportCode          : TIA
ServesRailwayStation : 0

LocationCode         : 30768
LocationName         : Tirana Downtown
Latitude             : 41.332
Longitude            : 19.832
CountryCode          : AL
FormattedAddress     : Rruga E Durresit. Nr 61, Tirana
CityName             : Tirana
ServesAirport        : 0
AirportCode          : 
ServesRailwayStation : 0

もっと良い方法はありますか?

より良い方法がある場合、これを機能させるために厳密モードをオフにしたくありません。

ストリクトモードで動作するものはすべて許容されます。T-SQLCASE式Pythonのdictgetメソッドのようなものを探していましたたぶんそれを行うXPathの方法もあります。

JPBlanc

あなたの場合、それは簡単です:

select-Xml -Xml $InputXml -XPath '//ns:Location' -Namespace @{ns = 'http://www.cartrawler.com/'} |
% {
  $n = $_.Node

  [PSCustomObject] @{
    LocationCode = $n.Id
    LocationName = $n.Name
    Latitude = $n.Lat
    Longitude = $n.Lng
    CountryCode = $n.CountryCode
    FormattedAddress = $n.Address
    CityName = $n.CityName
    ServesAirport = $n.Airport
    AirportCode = $(if($n.Airport -eq '1'){$n.AirportCode}else{""})
    ServesRailwayStation = $n.RailwayStation
  }
}

より一般的に:

select-Xml -Xml $InputXml -XPath '//ns:Location' -Namespace @{ns = 'http://www.cartrawler.com/'} |
% {
  $n = $_.Node

  [PSCustomObject] @{
    LocationCode = $n.Id
    LocationName = $n.Name
    Latitude = $n.Lat
    Longitude = $n.Lng
    CountryCode = $n.CountryCode
    FormattedAddress = $n.Address
    CityName = $n.CityName
    ServesAirport = $n.Airport
    AirportCode = $(if($n.GetAttributeNode("AirportCode") -ne $null){$n.AirportCode}else{""})
    ServesRailwayStation = $n.RailwayStation
  }
}

これが書かれると、私の古いプログラマーの意見(あなたが気にしない種類)は、厳密モードを使用したい場合は、スクリプトを停止して、Java、C#、C、またはC ++の記述を開始することです。厳密モードで戦っている近似の種類は、スクリプトの+であり、これは私にとってテーブルの隅にある問題を迅速に解決するためのものです。私の意見では、厳密モードを使用すると、従来のプログラミングのすべての欠点が無関心になりますが、それは私の意見です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

一部の行で列の値が欠落している場合にTextBlobを適用するにはどうすればよいですか?

分類Dev

一部のキーを無視して、オブジェクトの特定の値を変換するにはどうすればよいですか?

分類Dev

オブジェクトの一部の属性を更新するにはどうすればよいですか?

分類Dev

IDが別の列のごく一部である場合、オブジェクトを選択するにはどうすればよいですか?

分類Dev

一部のノードが欠落している場合は、XMLをRでCSVに変換します

分類Dev

一部のデバイスのAndroidビルドで欠落しているゲームオブジェクトを修正するにはどうすればよいですか?

分類Dev

一部の変数がPythonクラスオブジェクトに表示されないようにするにはどうすればよいですか?

分類Dev

一部の行が互いに欠落している場合でも、2つのテーブルを結合するにはどうすればよいですか?

分類Dev

一部の行がその関連オブジェクトに対してnull値を返す場合にselect_related()を使用するにはどうすればよいですか?

分類Dev

オブジェクトのリストの一部である場合、オブジェクト属性にアクセスするにはどうすればよいですか?

分類Dev

Jestを使用してオブジェクトの一部をテストするにはどうすればよいですか?

分類Dev

配列オブジェクトの文字の一部を使用して配列を検索するにはどうすればよいですか?

分類Dev

オブジェクトモデルの一部をEntityFrameworkとSQLServerのXML列にマップするにはどうすればよいですか?

分類Dev

Jq:オブジェクトにオブジェクトの配列があり、値が一致しないキーを持っている場合、オブジェクトを選択するにはどうすればよいですか?

分類Dev

オブジェクトの一部を女性として作成するにはどうすればよいですか?

分類Dev

Typescriptでフィールドが欠落しているオブジェクトを別のオブジェクトにキャストするにはどうすればよいですか?

分類Dev

オブジェクト名が変数に含まれている場合、オブジェクトの特定の属性を設定するにはどうすればよいですか?

分類Dev

JSONにシリアル化してオブジェクトを印刷しようとすると、一部のメンバーが欠落しているのはなぜですか?

分類Dev

XMLをPythonオブジェクトに変換するにはどうすればよいですか?

分類Dev

JAX-RSインターフェースを使用してオブジェクトの一部(サブオブジェクト)をシリアル化できないようにするにはどうすればよいですか?

分類Dev

Rを使用して一部の値が欠落している一意の識別子に欠落しているゼロを追加するにはどうすればよいですか?

分類Dev

torch.tensorオブジェクトを作成し、その要素の一部のみを更新するにはどうすればよいですか?

分類Dev

一部のプロパティがDTOにない場合、DTOオブジェクトをエンティティにマップするにはどうすればよいですか?

分類Dev

戻りオブジェクトの一部を変換しながら、Javascriptで配列のマップを実行するにはどうすればよいですか?

分類Dev

一部の値に値の一部として区切り文字が含まれている場合、「key = value、key = value、...」をcsvに変換するにはどうすればよいですか?

分類Dev

描画したfabricjsテキストオブジェクトの一部をスタイル設定するにはどうすればよいですか?

分類Dev

オブジェクトの配列から、オブジェクトのvalueAが変数と一致する場合にオブジェクトのvalueBを取得するにはどうすればよいですか?

分類Dev

反応して、文字列がオブジェクトに変換されていることを解決するにはどうすればよいですか?

分類Dev

一部のキーが文字列ではない場合、Python dictをJSONに変換するにはどうすればよいですか?

Related 関連記事

  1. 1

    一部の行で列の値が欠落している場合にTextBlobを適用するにはどうすればよいですか?

  2. 2

    一部のキーを無視して、オブジェクトの特定の値を変換するにはどうすればよいですか?

  3. 3

    オブジェクトの一部の属性を更新するにはどうすればよいですか?

  4. 4

    IDが別の列のごく一部である場合、オブジェクトを選択するにはどうすればよいですか?

  5. 5

    一部のノードが欠落している場合は、XMLをRでCSVに変換します

  6. 6

    一部のデバイスのAndroidビルドで欠落しているゲームオブジェクトを修正するにはどうすればよいですか?

  7. 7

    一部の変数がPythonクラスオブジェクトに表示されないようにするにはどうすればよいですか?

  8. 8

    一部の行が互いに欠落している場合でも、2つのテーブルを結合するにはどうすればよいですか?

  9. 9

    一部の行がその関連オブジェクトに対してnull値を返す場合にselect_related()を使用するにはどうすればよいですか?

  10. 10

    オブジェクトのリストの一部である場合、オブジェクト属性にアクセスするにはどうすればよいですか?

  11. 11

    Jestを使用してオブジェクトの一部をテストするにはどうすればよいですか?

  12. 12

    配列オブジェクトの文字の一部を使用して配列を検索するにはどうすればよいですか?

  13. 13

    オブジェクトモデルの一部をEntityFrameworkとSQLServerのXML列にマップするにはどうすればよいですか?

  14. 14

    Jq:オブジェクトにオブジェクトの配列があり、値が一致しないキーを持っている場合、オブジェクトを選択するにはどうすればよいですか?

  15. 15

    オブジェクトの一部を女性として作成するにはどうすればよいですか?

  16. 16

    Typescriptでフィールドが欠落しているオブジェクトを別のオブジェクトにキャストするにはどうすればよいですか?

  17. 17

    オブジェクト名が変数に含まれている場合、オブジェクトの特定の属性を設定するにはどうすればよいですか?

  18. 18

    JSONにシリアル化してオブジェクトを印刷しようとすると、一部のメンバーが欠落しているのはなぜですか?

  19. 19

    XMLをPythonオブジェクトに変換するにはどうすればよいですか?

  20. 20

    JAX-RSインターフェースを使用してオブジェクトの一部(サブオブジェクト)をシリアル化できないようにするにはどうすればよいですか?

  21. 21

    Rを使用して一部の値が欠落している一意の識別子に欠落しているゼロを追加するにはどうすればよいですか?

  22. 22

    torch.tensorオブジェクトを作成し、その要素の一部のみを更新するにはどうすればよいですか?

  23. 23

    一部のプロパティがDTOにない場合、DTOオブジェクトをエンティティにマップするにはどうすればよいですか?

  24. 24

    戻りオブジェクトの一部を変換しながら、Javascriptで配列のマップを実行するにはどうすればよいですか?

  25. 25

    一部の値に値の一部として区切り文字が含まれている場合、「key = value、key = value、...」をcsvに変換するにはどうすればよいですか?

  26. 26

    描画したfabricjsテキストオブジェクトの一部をスタイル設定するにはどうすればよいですか?

  27. 27

    オブジェクトの配列から、オブジェクトのvalueAが変数と一致する場合にオブジェクトのvalueBを取得するにはどうすればよいですか?

  28. 28

    反応して、文字列がオブジェクトに変換されていることを解決するにはどうすればよいですか?

  29. 29

    一部のキーが文字列ではない場合、Python dictをJSONに変換するにはどうすればよいですか?

ホットタグ

アーカイブ