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 ファイルからスキーマを生成
コメント
コメントを投稿