PowerShellでXMLファイルからXMLスキーマを生成する

目的

まともにソフトも入れられないような環境にいる会社員にはPowerShellがある!
という気持ちを元に、PowerShellでXMLスキーマを生成する方法を書く。

PowerShellバージョン

Name                           Value
----                           -----
PSVersion                      5.1.17763.134
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.134
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

サンプルファイル

昨日の記事で出したS-ZEDIのサンプルファイルを利用。
sample.xml
<?xml version="1.0"?>
<EDIInf1>
<SubsetSpecifiedID>Z01</SubsetSpecifiedID>
<BusinessProcessSpecifiedID>001</BusinessProcessSpecifiedID>
<ExchangedDocumentID>123456-01</ExchangedDocumentID>
<IssueDateTime>20181225</IssueDateTime>
<IssuerAssignedID>A-123456</IssuerAssignedID>
<PayerID>1234567890123</PayerID>
<PayeeID>3456789012345</PayeeID>
<BuyerName>全銀商事</BuyerName>
<BuyerID>3456789012345</BuyerID>
<PaymentTotalAmount>10800</PaymentTotalAmount>
<TaxCalculatedAmount1>800</TaxCalculatedAmount1>
<TaxCalculatedRate1>8</TaxCalculatedRate1>
<TaxTotalAmount>800</TaxTotalAmount>
<Content>サンプルデータ</Content>
</EDIInf1>

スクリプト

PowerShellを立てあげて所定の箇所($xmlpathに指すファイルパス)に目的のXMLファイルのパスを入力する。
$outpathには、出力先を記載する。XMLスキーマの拡張子は.xsdにしておくといいだろう。
で、実行すれば$outpathの箇所にスキーマが生成される。

#入力ファイルと出力先を指定
$xmlpath = "J:\workspace\sample.xml"
$outpath = "J:\workspace\output.xsd"
# .Netオブジェクト生成(XMLスキーマを類推する)
$inf = [System.Xml.Schema.XmlSchemaInference]::new()
# XMLファイルを読み込みスキーマセット(キャッシュの格納)を生成
$sc = $inf.InferSchema([System.Xml.XmlTextReader]::new($xmlpath))
# Writerで出力する
$w = [System.Xml.XmlWriter]::Create([System.IO.StreamWriter]::new($outpath))
foreach ($s in $sc.Schemas()) { $s.Write($w)}

結果ファイル

output.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="EDIInf1">
<xs:complexType>
<xs:sequence>
<xs:element name="SubsetSpecifiedID" type="xs:string" />
<xs:element name="BusinessProcessSpecifiedID" type="xs:unsignedByte" />
<xs:element name="ExchangedDocumentID" type="xs:string" />
<xs:element name="IssueDateTime" type="xs:unsignedInt" />
<xs:element name="IssuerAssignedID" type="xs:string" />
<xs:element name="PayerID" type="xs:unsignedLong" />
<xs:element name="PayeeID" type="xs:unsignedLong" />
<xs:element name="BuyerName" type="xs:string" />
<xs:element name="BuyerID" type="xs:unsignedLong" />
<xs:element name="PaymentTotalAmount" type="xs:unsignedShort" />
<xs:element name="TaxCalculatedAmount1" type="xs:unsignedShort" />
<xs:element name="TaxCalculatedRate1" type="xs:unsignedByte" />
<xs:element name="TaxTotalAmount" type="xs:unsignedShort" />
<xs:element name="Content" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

まとめ

PowerShellは楽

PowerShellはWindows10環境ならばすでに整えられている環境なので、誰でも使うことができる。非常に使いやすいスクリプトだ。
Window10はLinux等も使えるようになったので、コンソールはそっちを使ってもいいのだけれど、PowerShellの強みは.Netが使えることだ。.Netは結構いろいろなことができる。
このように、apt-getなど新たにコマンドを準備する必要もなく、ちょっとした変換作業などもできるので、重用してもいいのではないだろうか。

XMLスキーマを使う余地は?

XMLスキーマを使う用途は、開発者くらいしか使わないものではあるものの、これをExcelなどに読み込ませることで、ExcelからXMLファイルを作ることも可能である。
ただ、一からXMLスキーマを作成するのは大変だ。ならば、既存のXMLファイルから作成するという方法論は一つの解決策になるかもしれない。
例えば、昨日の記事のZEDIを利用する人たちには、エンジニアだけでなくただの経理の人も多いだろう。そういった人たちがPowerShellとか使う?っていう疑問もあるものの、手軽にそういった利用ができるのであれば、興味のある人には助けになるかもしれない。

参考
S-ZEDIのファイル
スクリプトの参考元 [.net][visual studio][c#][tips] C# TIPS:XML ファイルからスキーマを生成

コメント

このブログの人気の投稿

リモートワークをLogicoolのマウスとキーボードで複数PC切り替えて優勝した

VBAでのInterfaceやキャスト

SUPERHOTがいかにSUPERHOTか語りたい