<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>dev &gt;&gt; XML</title><link>http://blogs.wankuma.com/pinzolo/category/762.aspx</link><description>dev &gt;&gt; XML</description><managingEditor>THREE-ONE</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>THREE-ONE</dc:creator><title>XslCompiledTransform で xsl:output の設定内容を反映させるには</title><link>http://blogs.wankuma.com/pinzolo/archive/2008/09/08/155856.aspx</link><pubDate>Mon, 08 Sep 2008 16:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2008/09/08/155856.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/155856.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2008/09/08/155856.aspx#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/155856.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/155856.aspx</trackback:ping><description>XslCompiledTransform.Transform では、出力先が XmlWriter の場合、ロードした xsl:output の設定内容はデフォルトでは反映されない。&lt;br /&gt;
OutputSettings プロパティに、output 要素の設定内容が格納されているので、XmlWriter.Create 時に渡してやる必要がある。
&lt;textarea name="code" class="C#"&gt;
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(@"C:\xslt.xsl");
XmlWriter writer = XmlWriter.Create(@"C:\result.html", xslt.OutputSettings);
&lt;/textarea&gt;
これで DOCTYPE を指定したり、xml 宣言を出力しないようにできる。&lt;br /&gt;
特に DOCTYPE を指定するのは、XmlWriterSettings じゃできないので注意。&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/155856.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>xsd:enumeration</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/07/07/84228.aspx</link><pubDate>Sat, 07 Jul 2007 16:46:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/07/07/84228.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/84228.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/07/07/84228.aspx#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/84228.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/84228.aspx</trackback:ping><description>制約ファセットで一つ忘れてました。&lt;br/&gt;
enumeration 制約ファセットなるものがあります。&lt;br/&gt;
これは、特定の値しか設定させないという制約ファセットです。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Enabled"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xsd:string"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="False"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
このような、属性定義を行うと Enabled 属性には True か False しか設定できなくなります。&lt;br/&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="nowrap"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xsd:string"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="nowrap"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
とすれば一応下記と同値になるのかな？（やんないけどね）
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="nowrap"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xsd:string"&lt;/span&gt; &lt;span class="attr"&gt;fixed&lt;/span&gt;&lt;span class="kwrd"&gt;="nowrap"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/84228.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>制約ファセット（その２：正規表現編）</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/06/23/81828.aspx</link><pubDate>Sat, 23 Jun 2007 16:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/06/23/81828.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/81828.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/06/23/81828.aspx#Feedback</comments><slash:comments>337</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/81828.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/81828.aspx</trackback:ping><description>制約ファセットに pattern ファセットがあります。&lt;br/&gt;
これは正規表現を扱う制約ファセットなのですが、非常に強力です。&lt;br/&gt;
XML は所詮テキストなので、正規表現が利用できるとかなり便利なのは想像に難くないですね。&lt;br/&gt;
一般的な正規表現については割愛します。&lt;br/&gt;
&lt;br/&gt;
ここでは、あまりなじみのない特殊な正規表現を紹介します。&lt;br/&gt;
&lt;br/&gt;
【Unicode のカテゴリーで指定する】&lt;br/&gt;
\p{カテゴリー名} で指定されたカテゴリーに所属する文字を、\P{カテゴリー名} で指定されたカテゴリーに所属しない文字を指定することができます。&lt;br/&gt;
例えば、\p{Lu} なら大文字アルファベット、\p{Nd} なら数字、\P{Ll} なら小文字アルファベット以外の文字といった具合です。&lt;br/&gt;
&lt;br/&gt;
【Unicode のブロックで指定する】&lt;br/&gt;
\p{Isブロック名} で指定されたブロックに所属する文字を、\P{Isブロック名} で指定されたブロックに所属しない文字を指定することができます。&lt;br/&gt;
\p{IsGreek} ならギリシャ語、\p{IsHiragana} ならひらがな、\P{IsKatakana} ならカタカナ以外の文字といった具合です。&lt;br/&gt;
詳しくは &lt;a href="http://www.unicode.org/charts/" target="_blank"&gt;http://www.unicode.org/charts/&lt;/a&gt; で確認してみてください。&lt;br/&gt;
&lt;br/&gt;
【文字クラスの減算】&lt;br/&gt;
様々な文字クラスを集合の減算のように扱えます。&lt;br/&gt;
[\p{Nd}-[0]] で 0 以外の数字、[\p{IsBasicLatin}-[\p{Nd}]] で BasicLatin ブロックから数字を除いたものを指定できます。&lt;br/&gt;
&lt;br/&gt;
そして、これらは .NET Framework の System.Text.RegularExpressions.Regex クラスでも利用できます。&lt;br/&gt;
\p{IsHiragana}, \p{IsKatakana} あたりは、入力値のバリデートに利用できそうですね。&lt;br/&gt;
文字クラスの減算はできないと思ってたんですが、どうやら .NET 2.0 から利用できるようになったみたいですね。&lt;br/&gt;
&lt;pre&gt;
&lt;font color="#007a99"&gt;// .NET 1.x&lt;/font&gt;
Console.WriteLine(Regex.IsMatch(&lt;font color="#800000"&gt;&amp;quot;hogeA&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;^[&lt;/font&gt;&lt;font color="#800000"&gt;\\&lt;/font&gt;&lt;font color="#800000"&gt;p{IsBasicLatin}-[A]]+$&amp;quot;&lt;/font&gt;)); &lt;font color="#007a99"&gt;// False&lt;/font&gt;
Console.WriteLine(Regex.IsMatch(&lt;font color="#800000"&gt;&amp;quot;hogeB&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;^[&lt;/font&gt;&lt;font color="#800000"&gt;\\&lt;/font&gt;&lt;font color="#800000"&gt;p{IsBasicLatin}-[A]]+$&amp;quot;&lt;/font&gt;)); &lt;font color="#007a99"&gt;// False&lt;/font&gt;

&lt;font color="#007a99"&gt;// .NET 2.0&lt;/font&gt;
Console.WriteLine(Regex.IsMatch(&lt;font color="#800000"&gt;&amp;quot;hogeA&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;^[&lt;/font&gt;&lt;font color="#800000"&gt;\\&lt;/font&gt;&lt;font color="#800000"&gt;p{IsBasicLatin}-[A]]+$&amp;quot;&lt;/font&gt;)); &lt;font color="#007a99"&gt;// False&lt;/font&gt;
Console.WriteLine(Regex.IsMatch(&lt;font color="#800000"&gt;&amp;quot;hogeB&amp;quot;&lt;/font&gt;, &lt;font color="#800000"&gt;&amp;quot;^[&lt;/font&gt;&lt;font color="#800000"&gt;\\&lt;/font&gt;&lt;font color="#800000"&gt;p{IsBasicLatin}-[A]]+$&amp;quot;&lt;/font&gt;)); &lt;font color="#007a99"&gt;// True&lt;/font&gt;
&lt;/pre&gt;
こんなふうになりました。&lt;br/&gt;
&lt;br/&gt;
ちなみに Java だと、java.util.regex パッケージでは、文字クラスの減算はできません。&lt;br/&gt;
また、ブロック指定もプレフィクスが Is ではなく In になります。&lt;br/&gt;
ですが、Xerces で XML Schema を利用する際には、どちらも利用できます。&lt;br/&gt;
どうも Xerces 内部の org.apache.xerces.impl.xpath.regex.RegularExpression あたりが司ってそうな感じです。&lt;br/&gt;
ただ、パッケージが xpath ってのが気になるところではありますが。&lt;br/&gt;
直接 Java ソースから利用できるかなーと思ってみたんですが、めんどくさくなってあきらめました。&lt;br/&gt;
ちゃんと環境設定してやればできるんじゃないかなー&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/81828.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>制約ファセット（その１）</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/06/20/81444.aspx</link><pubDate>Wed, 20 Jun 2007 17:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/06/20/81444.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/81444.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/06/20/81444.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/81444.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/81444.aspx</trackback:ping><description>XML で要素内容や属性値をデータ型以上に制限したいときがあります。&lt;br/&gt;
たとえば、数値の上限を定めたかったり、文字数の下限・上限を定めた飼ったりする場合ですね。&lt;br/&gt;
そんな場合、独自データ型というものを作成します。&lt;br/&gt;
独自に単純型を定義する場合、基本的には「制限(ristriction)」という手段を用いて定義します。&lt;br/&gt;
そのとき利用するものが制約ファセットです。&lt;br/&gt;
制約ファセットは全て下記の記述で表現されます。&lt;br/&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:制約名&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="利用する値"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
そしてそれぞれの制約は、利用する際に基となるデータ型はほぼ決まっています。&lt;br/&gt;
各数値のデータ型、もしくは文字列型です。&lt;br/&gt;
数値の場合、minInclusive（以下）, minExclusive（未満）, maxInclusive（以上）, maxExclusive（より上）, totalDigits（桁総数）, fractionDigits（小数部の桁数）が利用できます。&lt;br/&gt;
文字列の場合、length, maxLength, minLength, pattern ですね。minLength や maxLength は指定された値を含みます。&lt;br/&gt;
このうち pattern 以外の三つは文字列以外にも適応できるのですが、意味合いが変わってくるので後日改めて書きます。&lt;br/&gt;
はっきり言って、簡単です。一つ理解すればほぼ理解できます。&lt;br/&gt;
というわけで簡単なサンプルだけ・・・
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TestType"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt; &lt;span class="attr"&gt;base&lt;/span&gt;&lt;span class="kwrd"&gt;="xsd:int"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:minInclusive&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="-100"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:maxInclusive&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="100"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:restriction&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
-100 から 100 までの整数値だけを許可するデータ型の定義です。&lt;br/&gt;
と、使い方は簡単なのですが、正規表現を利用する pattern 制約ファセットはかなり強力で特殊なため、次回もうちょっと詳しくメモりましょ。&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/81444.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>XML におけるコメントの記述位置</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/05/20/77419.aspx</link><pubDate>Sun, 20 May 2007 12:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/05/20/77419.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/77419.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/05/20/77419.aspx#Feedback</comments><slash:comments>196</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/77419.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/77419.aspx</trackback:ping><description>XML におけるコメントの書き方って、こうしている方がほとんどじゃないですか？
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;&amp;lt;!-- ログ保存先ディレクトリ設定 --&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="logDir"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="C:\log"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
私は定期的に XML におけるコメントの書き方ってこれでいいのかと？頭をよぎることがあります。&lt;br/&gt;
プログラミング言語において、コメントは 100% 人のためのものです。&lt;br/&gt;
しかし XML において、コメントはコメントノードという立派なひとつの構成要素であり、処理系から操作することができます。&lt;br/&gt;
処理系から操作できるということは、システムのためにコメントを書くのもアリだということです。&lt;br/&gt;
そして、コメントはほとんどの場合、どれかの要素の子要素です。（コメントはルート要素の外にも記述できます）&lt;br/&gt;
つまり、構造的にも関連を持たせるためには子要素にするのがよいのじゃないか？と思うのです。&lt;br/&gt;
要するに、上記の例で言うと下記のようにということですね。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="logDir"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="C:\log"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;&amp;lt;!-- ログ保存先ディレクトリ設定 --&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
実際に、XML Schema には xsd:annotation という、XML Schema の各定義に対する注釈を記述するための要素があり、子要素に xsd:documentation と xsd:appinfo を持ちます。&lt;br/&gt;
xsd:documentation はスキーマ文書の読者、つまり人のための注釈を記述し、xsd:appinfo にはスキーマを処理するアプリケーションのための注釈を記述します。&lt;br/&gt;
対象の定義と関連を持つ必要があるため、定義の子要素として記述しなければなりません。&lt;br/&gt;
ちなみに、xsd:schema 以外の定義に対しては、最初の子要素である必要があります。&lt;br/&gt;
もちろん注釈＝コメントではありません。コメントの一部とみなすことはできると思いますが。&lt;br/&gt;
&lt;br/&gt;
しかし、設定ファイルのようなファイルの場合、XSLT・XPath・DOM 等を利用して定義内容を一覧にしたい場合は無いですか？&lt;br/&gt;
そんな時、設定にたいするコメントを一緒に記載したくないですか？&lt;br/&gt;
コメントを子要素にしておけば、そんな場合に対するコーディングが非常に素直なものになります。（特に XSLT）&lt;br/&gt;
&lt;br/&gt;
決して、常にコメントをこう書くべきだというつもりはありません。&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;人から見ると、読みにくい（その他の書式にない形式なため、なれてない）&lt;/li&gt;
&lt;li&gt;ネストが必要以上に深くなる&lt;/li&gt;
&lt;li&gt;全体的に冗長になる&lt;/li&gt;
&lt;/ul&gt;
のように、デメリットも多々あります。&lt;br/&gt;
私も定期的に頭をよぎる割には、そのたび色々考えて、ほとんどの場合前者を採用してしまいます。&lt;br/&gt;
設定ファイルのように、他人に見せるファイルならなおさらです。&lt;br/&gt;
見てのとおり、デメリットは「人が見たとき」という面に集中しています。&lt;br/&gt;
しかし、システムが扱う場合は、このデメリットはほとんど意味がないでしょう。そして前述したメリットが生きてくる場合があります。&lt;br/&gt;
つまり、何らかの処理系で扱う XML の場合、処理内容によっては後者の方がいい場合もあるんじゃねーの？ってことですな&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/77419.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>空要素の定義</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/05/01/75230.aspx</link><pubDate>Tue, 01 May 2007 21:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/05/01/75230.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/75230.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/05/01/75230.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/75230.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/75230.aspx</trackback:ping><description>制約ファセットやるとかいっててウソばっかりです。&lt;br/&gt;
空要素の定義について書いておくの忘れてました。&lt;br/&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:complexType&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
これだけです。&lt;br/&gt;
なぜ simpleType ではありません。complexType です。&lt;br/&gt;
属性を持つ場合は、
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:complexType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:attribute&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="attr"&lt;/span&gt;&lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xsd:string"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsd:complexType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
簡単ですね。&lt;br/&gt;
&lt;br/&gt;
で、これ以外にも定義する方法があります。&lt;br/&gt;
空要素を定義するのではなく、空要素を許可するという定義があります。&lt;br/&gt;
前述の定義では、例えば br 要素や img 要素のように、絶対に中身を持たない要素を定義することになります。&lt;br/&gt;
内容があれば記述し、なければ空要素としたいということは往々にしてありますよね。&lt;br/&gt;
そんな場合は、このように記述します。&lt;br/&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsd:element&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="要素"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="要素型"&lt;/span&gt; &lt;span class="attr"&gt;nillable&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
これだけではダメなのです。
XML インスタンスにその要素に対して、xsi:nil="true" 属性を追加しなければなりません。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;要素&lt;/span&gt; &lt;span class="attr"&gt;xsi:nil&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
こんな感じです。&lt;br/&gt;
xsi とは XML Schema において XML インスタンス用に定義された名前空間です。&lt;br/&gt;
名前空間 URI は http://www.w3.org/2001/XMLSchema-instance です。&lt;br/&gt;
nil と nillable です。null ではありません。&lt;br/&gt;
nil は l が 1 本、nillable は l が 2 本繋がるところも注意です。&lt;br/&gt;
Ruby、Delphi なんかをやったことがある方にはおなじみかもしれませんね。&lt;br/&gt;
&lt;br/&gt;
んで、ぶっちゃけめんどくさくないですか？nillable だけでいーやんって私は思うのですが。&lt;br/&gt;
XML インスタンスがスキーマを知っている必要があるか？ということなんですね。&lt;br/&gt;
「XML インスタンスを作るアプリやシステムが」ではありません。「XML インスタンスそのものが」ということです。&lt;br/&gt;
出力するのはたかがひとつの属性です。&lt;br/&gt;
ですが、検証時には
&lt;ul&gt;
&lt;li&gt;nillable で定義されているか？&lt;/li&gt;
&lt;li&gt;xsi:nil="true" 属性がついているか？&lt;/li&gt;
&lt;li&gt;xsi の名前空間は正しいか？&lt;/li&gt;
&lt;/ul&gt;
を検証しなければなりません。めんどーだと思うんだけどなぁ。&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/75230.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>VB だとこんなことができるらしい</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72501.aspx</link><pubDate>Sun, 22 Apr 2007 21:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72501.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/72501.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72501.aspx#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/72501.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/72501.aspx</trackback:ping><description>ヘルプみてたらこんなサンプルがあった。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; contactDoc &lt;span class="kwrd"&gt;As&lt;/span&gt; XDocument = _
&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Patrick Hines&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="home"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;206-555-0144&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="work"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;425-555-0145&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;Dim&lt;/span&gt; contact &lt;span class="kwrd"&gt;As&lt;/span&gt; XElement = _
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Patrick Hines&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="home"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;206-555-0144&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="work"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;425-555-0145&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
VB だとソース内に直接 XML を書いてインスタンスを作れるのか。&lt;br/&gt;
それからこんなのもあった
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="rem"&gt;' Initialize the objects.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; phoneNumbers2 &lt;span class="kwrd"&gt;As&lt;/span&gt; Phone() = { _
    &lt;span class="kwrd"&gt;New&lt;/span&gt; Phone(&lt;span class="str"&gt;"home"&lt;/span&gt;, &lt;span class="str"&gt;"206-555-0144"&lt;/span&gt;), _
    &lt;span class="kwrd"&gt;New&lt;/span&gt; Phone(&lt;span class="str"&gt;"work"&lt;/span&gt;, &lt;span class="str"&gt;"425-555-0145"&lt;/span&gt;)}

&lt;span class="rem"&gt;' Convert the data contained in phoneNumbers2 to XML.&lt;/span&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; contact2 &lt;span class="kwrd"&gt;As&lt;/span&gt; XElement = _
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Patrick Hines&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= From p In phoneNumbers2 _
            Return &amp;lt;phone type=&amp;lt;%= p.Type &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;= p.Number &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;phone&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; _
        &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;contact&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
Console.WriteLine(contact2)
&lt;/pre&gt;
いや、まあなんというか・・・・うーむ&lt;br/&gt;
ASP.NET を見てるみたいだ。&lt;br/&gt;
作成される XML がどんなものになるのか？ってのは直感的にわかるような気はするな。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;Dim&lt;/span&gt; lbl &lt;span class="kwrd"&gt;As&lt;/span&gt; Label = _
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="lbl"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;cssClass&lt;/span&gt;&lt;span class="kwrd"&gt;="labelStyle"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;hoge&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
ひょっとしてこんなことできたりするのか？？？&lt;br/&gt;
さすがにないかなｗ&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/72501.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>XDocument と XmlDocument はどちらがパフォーマンスが良いか？</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72492.aspx</link><pubDate>Sun, 22 Apr 2007 20:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72492.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/72492.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72492.aspx#Feedback</comments><slash:comments>298</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/72492.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/72492.aspx</trackback:ping><description>というわけで試してみましょう。&lt;br/&gt;
ソースはこちら↓
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DoTest() {
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.CreateDocumentWithXmlDocument();
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.CreateDocumentWithXDocument();
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateDocumentWithXmlDocument() {
    Stopwatch sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();
    sw.Start();
    XmlImplementation impl = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlImplementation();
    XmlDocument doc = impl.CreateDocument();
    XmlElement root = doc.CreateElement(&lt;span class="str"&gt;"root"&lt;/span&gt;);
    doc.AppendChild(root);
    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10000; i++) {
        XmlElement item = doc.CreateElement(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"要素_{0:0000}"&lt;/span&gt;, i));
        XmlAttribute attr = doc.CreateAttribute(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"属性_{0:0000}"&lt;/span&gt;, i));
        attr.Value = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"属性値_{0:0000}"&lt;/span&gt;, i);
        item.Attributes.Append(attr);
        XmlText text = doc.CreateTextNode(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"要素内容_{0:0000}"&lt;/span&gt;, i));
        item.AppendChild(text);
        root.AppendChild(item);
    }
    sw.Start();
    Console.WriteLine(&lt;span class="str"&gt;"With XmlDocument : {0}"&lt;/span&gt;, sw.ElapsedTicks);
    doc.Save(&lt;span class="str"&gt;@"D:\temp\XmlDocument.xml"&lt;/span&gt;);
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateDocumentWithXDocument() {
    Stopwatch sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();
    sw.Start();
    XDocument doc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XDocument();
    XElement root = &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"root"&lt;/span&gt;);
    doc.Add(root);
    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10000; i++) {
        XElement item = &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"要素_{0:0000}"&lt;/span&gt;, i));
        item.Value = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"要素内容_{0:0000}"&lt;/span&gt;, i);
        XAttribute attr =
            &lt;span class="kwrd"&gt;new&lt;/span&gt; XAttribute(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"属性_{0:0000}"&lt;/span&gt;, i), &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"属性値_{0:0000}"&lt;/span&gt;, i));
        item.Add(attr);
        root.Add(item);
    }
    sw.Start();
    Console.WriteLine(&lt;span class="str"&gt;"With XDocument   : {0}"&lt;/span&gt;, sw.ElapsedTicks);
    doc.Save(&lt;span class="str"&gt;@"D:\temp\XDocument.xml"&lt;/span&gt;);
}
&lt;/pre&gt;
んで、結果がコレ(三回分)&lt;br/&gt;
・With XmlDocument : 467673, 460969, 470390&lt;br/&gt;
・With XDocument   : 546143, 579681, 589850&lt;br/&gt;
わずかながら、XmlDocument のほうがパフォーマンスいいですね。&lt;br/&gt;
まあ、10000回ループさせてこれなら XDocument での XML 生成も全然アリでしょう。&lt;br/&gt;
ちなみに XDocument は自動的に XML 宣言を追加してくれました。&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/72492.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>LINQ と XQuery</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72446.aspx</link><pubDate>Sun, 22 Apr 2007 11:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72446.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/72446.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72446.aspx#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/72446.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/72446.aspx</trackback:ping><description>&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="UTF-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="11"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="12"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="13"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="21"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="22"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="23"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="31"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="32"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="33"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
コレに対して、key の値が 20 台のものを LINQ で取得してみましょう。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
XDocument doc = XDocument.Load(&lt;span class="str"&gt;@"D:\temp\test.xml"&lt;/span&gt;);
XElement documentElement = (XElement)doc.FirstNode;
IEnumerable&amp;lt;XElement&amp;gt; elements =
    &lt;span class="kwrd"&gt;from&lt;/span&gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; documentElement.Elements(&lt;span class="str"&gt;"item"&lt;/span&gt;)
    &lt;span class="kwrd"&gt;let&lt;/span&gt; keyValue = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(item.Attribute(&lt;span class="str"&gt;"key"&lt;/span&gt;).Value)
    &lt;span class="kwrd"&gt;where&lt;/span&gt; (20 &amp;lt; keyValue) &amp;amp;&amp;amp; (keyValue &amp;lt; 30)
    &lt;span class="kwrd"&gt;select&lt;/span&gt; item;
&lt;/pre&gt;
同じことを XQuery でやってみます。
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;hoge&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
{
    &lt;span class="kwrd"&gt;FOR&lt;/span&gt; $item &lt;span class="kwrd"&gt;IN&lt;/span&gt; document(&lt;span class="str"&gt;"test.xml"&lt;/span&gt;)//item
    &lt;span class="kwrd"&gt;LET&lt;/span&gt; $key := $item/@key
    &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; $key &amp;gt; 20 &lt;span class="kwrd"&gt;AND&lt;/span&gt; $key &amp;lt; 30
    &lt;span class="kwrd"&gt;RETURN&lt;/span&gt; $item
}
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;hoge&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
そっくりだと思いません？&lt;br/&gt;
for と from、return と select が異なりますが、かなり似てます。&lt;br/&gt;
これはうれしいですね。&lt;br/&gt;
&lt;br/&gt;
from より for のほうがよかったなぁ。from in ってなんか違和感があるわぁ&lt;br/&gt;
&lt;br/&gt;
# XQuery については、そのうち(XML Schema が終わったらかな)この blog でも書いていくつもりです&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/72446.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>THREE-ONE</dc:creator><title>LINQ と XPath</title><link>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72444.aspx</link><pubDate>Sun, 22 Apr 2007 10:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72444.aspx</guid><wfw:comment>http://blogs.wankuma.com/pinzolo/comments/72444.aspx</wfw:comment><comments>http://blogs.wankuma.com/pinzolo/archive/2007/04/22/72444.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/pinzolo/comments/commentRss/72444.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/pinzolo/services/trackbacks/72444.aspx</trackback:ping><description>さて LINQ の式にスポットを当ててみましょう。&lt;br/&gt;
Elements メソッドは子要素の IEnumerable&amp;lt;XElement&amp;gt; を取得します。&lt;br/&gt;
引数に XName を渡すと、指定のの名前の要素のみ列挙します。&lt;br/&gt;
もっと複雑な取得方法もできます。&lt;br/&gt;
たとえばこんな XML に対して同じことをしてみましょう。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="UTF-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="11"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="12"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="13"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;1-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="21"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="22"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="23"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="31"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="32"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="33"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;3-3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;child&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;root&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
Elements メソッドを使うとこうなります。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
IEnumerable&amp;lt;XElement&amp;gt; elements =
    &lt;span class="kwrd"&gt;from&lt;/span&gt; child &lt;span class="kwrd"&gt;in&lt;/span&gt; documentElement.Elements()
    &lt;span class="kwrd"&gt;from&lt;/span&gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; documentElement.Elements()
    &lt;span class="kwrd"&gt;where&lt;/span&gt; item.Attribute("key").Value.EndsWith(&lt;span class="str"&gt;"1"&lt;/span&gt;)
    &lt;span class="kwrd"&gt;select&lt;/span&gt; item;
&lt;/pre&gt;
ところが DescendantsAndSelf というメソッドがありまして、これを使うと下記の様にできます。
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;
IEnumerable&amp;lt;XElement&amp;gt; elements =
    &lt;span class="kwrd"&gt;from&lt;/span&gt; item &lt;span class="kwrd"&gt;in&lt;/span&gt; documentElement.DescendantsAndSelf(&lt;span class="str"&gt;"item"&lt;/span&gt;)
    &lt;span class="kwrd"&gt;where&lt;/span&gt; item.Attribute("key").Value.EndsWith(&lt;span class="str"&gt;"1"&lt;/span&gt;)
    &lt;span class="kwrd"&gt;select&lt;/span&gt; item;
&lt;/pre&gt;
ピンと来た方もいらっしゃるでしょう。&lt;br/&gt;
XPath には軸という概念があります。&lt;br/&gt;
で、この軸ごとにメソッドがあるみたいです。&lt;br/&gt;
ざっと列挙すると&lt;br/&gt;
&lt;table border="1" cellpadding="1" cellspacing="1"&gt;
&lt;tr&gt;
&lt;td&gt;メソッド&lt;/td&gt;&lt;td&gt;軸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Elements&lt;/td&gt;&lt;td&gt;child&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;Attributes&lt;/td&gt;&lt;td&gt;attribute&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;Ancestors&lt;/td&gt;&lt;td&gt;ancestor&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;AncestorsAndSelf&lt;/td&gt;&lt;td&gt;ancestor-or-self&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;Descendants&lt;/td&gt;&lt;td&gt;descendant&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;DescendantsAndSelf&lt;/td&gt;&lt;td&gt;descendant-or-self&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;NodesAfterSelf&lt;/td&gt;&lt;td&gt;following-sibiling&lt;/td&gt;
&lt;tr&gt;&lt;td&gt;NodesBeforeSelf&lt;/td&gt;&lt;td&gt;preceding-sibiling&lt;/td&gt;
&lt;/table&gt;
こんな感じかなぁ、全部の軸はなさげですね。(following とかは 親を取得してやれってことかな？）&lt;br/&gt;
軸名とメソッド名がリンクしていないのが惜しいです・・・・&lt;img src ="http://blogs.wankuma.com/pinzolo/aggbug/72444.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>