XPath Expressionを使用したXMLファイルの解析
XPathを使用してXMLファイルから値を取得するにはどのようにすればよいですか?
例: 以下のXMLファイルには、様々なカテゴリ(料理本、児童図書、Webブック)の本と、各本のタイトル、著者、出版年、価格の情報が含まれています。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XPath Basics</title>
<author>Omar Little</author>
<year>2002</year>
<price>5.08</price>
</book>
<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
Webブックの情報のみを取得するにはどのようにすればよいですか?
回答
OutSystemsには、XMLファイルの解析、操作、シリアル化ができるXMLエクステンションがあります。XPath Expressionもサポートしています。
XMLファイルからWebブックの情報を取得するには、以下の手順を実行します。
-
モジュールに以下の依存関係を追加します。
- BinaryDataエクステンションのBinaryDataToText
- XmlエクステンションのXmlDocument_Load_v2
- XmlエクステンションのXmlDocument_SelectNodes
- XmlエクステンションのXmlElement_GetInnerText
- XmlエクステンションのXmlElement_SelectSingleNode
- XmlエクステンションのXmlNodeList_Count
- XmlエクステンションのXmlNodeList_Item
-
Title
(Text)、Author
(Text)、Year
(Integer)、Price
(Decimal)の各アトリビュートを含むBook
ストラクチャを作成します。 -
サーバーアクションを作成し、以下の変数を追加します。
XML
: Binary Dataデータ型の必須入力パラメータ
Encoding
: Textデータ型のオプションの入力パラメータ
Current
: Integerデータ型
でデフォルト値
が0のローカル変数
Book
: Bookデータ型のローカル変数
Books
: Book Listデータ型の出力パラメータ
サーバーアクションはXMLファイルとオプションの
Encoding
引数を受け取り、XMLファイルから取得したBooksのリストを返します。 -
XMLエクステンションのXmlDocument_Load_v2アクションを追加し、入力
Xml
を以下のように設定します。BinaryDataToText(XML,Encoding)
これにより、XMLバイナリファイルがテキストに変換されDOMオブジェクトにロードされます。
-
前のアクションの後に、XMLエクステンションのXmlDocument_SelectNodesアクションを追加します。入力
XmlDocument
を「XmlDocument_Load_v2.XmlDocument
」に設定し、入力XPathString
を「"/bookstore/book[@category='web']"
」に設定します。これにより、XPathでフィルタリングされたWebカテゴリに属する本のリストが返されます。
-
前のアクションの後に、XMLエクステンションのXmlNodeList_Countアクションを追加し、入力
XmlNodeList
を「XmlDocument_SelectNodes.XmlNodeList
」に設定します。これにより、フィルタリングされたリスト内のWebブックの合計数がカウントされます。
-
前のアクションの後にIfノードを追加し、
Condition
を「Current < XmlNodeList_Count.Count
」に設定します。これにより、
Current
変数がフィルタリングされたリスト内のWebブックの合計数と等しくなったときに停止するループが作成されます。 -
Ifの横に、XMLエクステンションのXmlNodeList_Itemアクションを追加し、それをTrueブランチに接続します。入力
XmlNodeList
を「XmlDocument_SelectNodes.XmlNodeList
」に設定し、入力Index
を「Current
」に設定します。これにより、(
Current
変数を使用して)いずれかのWebブックが取得されます。 -
前のアクションの後に、XMLエクステンションのXmlElement_SelectSingleNodeアクションを追加します。入力
XmlElement
を「XmlNodeList_Item.XmlNode
」に設定し、入力XPathString
を「"title"
」に設定します。これにより、現在のWebブックのtitleノードが選択されます。
-
前のアクションの後に、XMLエクステンションのXmlElement_GetInnerTextアクションを追加し、入力
XmlElement
を「XmlElement_SelectSingleNode.XmlNode
」に設定します。これにより、現在のWebブックのタイトルが取得されます。
-
前の2つの手順を
author
、year
、price
の各アトリビュートで繰り返します。入力をそれぞれ適切に変更します。これにより、現在のWebブックの残りの情報が選択・取得されます。
-
XmlElement_GetInnerText4アクションの後にAssignノードを追加し、以下のAssignmentsを設定します。
Current
=Current+1
Book.Title
=XmlElement_GetInnerText.InnerText
Book.Author
=XmlElement_GetInnerText2.InnerText
Book.Year
=TextToInteger(XmlElement_GetInnerText3.InnerText)
Book.Price
=TextToDecimal(XmlElement_GetInnerText4.InnerText)
これにより、収集された情報が
Book
ローカル変数に割り当てられます。 -
Assignの後にListAppendを追加し、それをIfに接続します。入力
List
を「Books
」に設定し、入力Element
を「Book
」に設定します。これにより、現在のWebブックの情報が
Books
出力に追加されます。
サーバーアクションは以下の画像のようになります。