Cocoaの機能を使ってXMLエンコード/デコードするAppleScriptハンドラ


```AppleScript:encodeXML.scpt
use framework "Foundation"

set encodedXML to my encodeXML("<p>あいうえお</p>
<strong>かきくけこ</strong>")
(*"&lt;p&gt;あいうえお&lt;/p&gt;
&lt;strong&gt;かきくけこ&lt;/strong&gt;"*)

on encodeXML(XML as text)
	--require framework: Foundation
	set attributedString to current application's NSAttributedString's alloc()'s initWithString:XML
	set attributes to current application's NSDictionary's dictionaryWithObject:(current application's NSHTMLTextDocumentType) forKey:(current application's NSDocumentTypeDocumentAttribute)
	set HTMLData to attributedString's dataFromRange:{location:0, |length|:attributedString's |length|} documentAttributes:attributes |error|:(missing value)
	set HTMLString to current application's NSString's alloc()'s initWithData:HTMLData encoding:(current application's NSUTF8StringEncoding)
	set HTMLContent to item 2 of item 1 of my regexMatches(HTMLString, "<body>\\s([\\w\\W]*)\\s</body>")
	return my regexReplace(HTMLContent, "<[^>]*>", "")
end encodeXML

on regexMatches(aText as text, pattern as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	set aString to current application's NSString's stringWithString:aText
	set matches to regularExpression's matchesInString:aString options:0 range:{location:0, |length|:aString's |length|()}
	
	set matchResultList to {}
	repeat with match in matches
		set matchResult to {}
		repeat with i from 0 to (match's numberOfRanges as integer) - 1
			set end of matchResult to (aString's substringWithRange:(match's rangeAtIndex:i)) as text
		end repeat
		set end of matchResultList to matchResult
	end repeat
	return matchResultList
end regexMatches

on regexReplace(aText as text, pattern as text, replacement as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	return (regularExpression's stringByReplacingMatchesInString:aText options:0 range:{location:0, |length|:count aText} withTemplate:replacement) as text
end regexReplace
```

```AppleScript:decodeXML.scpt
use framework "Foundation"

my decodeXML("&lt;p&gt;あいうえお&lt;/p&gt;
&lt;strong&gt;かきくけこ&lt;/strong&gt;")
(*<p>あいうえお</p>
<strong>かきくけこ</strong>*)

on decodeXML(XML as text)
	set HTMLContent to my regexReplace(XML, "[\\n\\r]", "<br/>" & linefeed)
	return my convertHTMLToPlainText(HTMLContent)
end decodeXML

on regexReplace(aText as text, pattern as text, replacement as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	return (regularExpression's stringByReplacingMatchesInString:aText options:0 range:{location:0, |length|:count aText} withTemplate:replacement) as text
end regexReplace

on convertHTMLToPlainText(HTML)
	--require framework: Foundation
	set attributedString to my attributedStringOfHTMLText(HTML)
	return attributedString's |string| as text
end convertHTMLToPlainText

on attributedStringOfHTMLText(HTML as text)
	--require framework: Foundation
	set HTMLString to current application's NSString's stringWithString:HTML
	set HTMLData to HTMLString's dataUsingEncoding:(current application's NSUnicodeStringEncoding)
	return current application's NSAttributedString's alloc()'s initWithHTML:HTMLData documentAttributes:(missing value)
end attributedStringOfHTMLText
```

## 更新履歴

* 2016-09-05: NSAttributedStringクラスを使って作成
* 2017-07-21: `encodeXML`ハンドラにおいて`regexMatches`ハンドラと`regexReplace`ハンドラを使用