この記事では、LINQ to XML と現在の主要な XML プログラミング API である W3C ドキュメント オブジェクト モデル (DOM) の主な違いについて説明します。
XML ツリーを構築する新しい方法
W3C DOM では、下から上に XML ツリーを作成します。つまり、ドキュメントを作成し、要素を作成してから、その要素をドキュメントに追加します。
たとえば、次の例では、一般的な方法を使用して、MICROSOFT の DOM XmlDocument実装を使用して XML ツリーを作成します。
XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
XmlElement phone1 = doc.CreateElement("Phone");
phone1.SetAttribute("Type", "Home");
phone1.InnerText = "206-555-0144";
XmlElement phone2 = doc.CreateElement("Phone");
phone2.SetAttribute("Type", "Work");
phone2.InnerText = "425-555-0145";
XmlElement street1 = doc.CreateElement("Street1");
street1.InnerText = "123 Main St";
XmlElement city = doc.CreateElement("City");
city.InnerText = "Mercer Island";
XmlElement state = doc.CreateElement("State");
state.InnerText = "WA";
XmlElement postal = doc.CreateElement("Postal");
postal.InnerText = "68042";
XmlElement address = doc.CreateElement("Address");
address.AppendChild(street1);
address.AppendChild(city);
address.AppendChild(state);
address.AppendChild(postal);
XmlElement contact = doc.CreateElement("Contact");
contact.AppendChild(name);
contact.AppendChild(phone1);
contact.AppendChild(phone2);
contact.AppendChild(address);
XmlElement contacts = doc.CreateElement("Contacts");
contacts.AppendChild(contact);
doc.AppendChild(contacts);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
Dim phone1 As XmlElement = doc.CreateElement("Phone")
phone1.SetAttribute("Type", "Home")
phone1.InnerText = "206-555-0144"
Dim phone2 As XmlElement = doc.CreateElement("Phone")
phone2.SetAttribute("Type", "Work")
phone2.InnerText = "425-555-0145"
Dim street1 As XmlElement = doc.CreateElement("Street1")
street1.InnerText = "123 Main St"
Dim city As XmlElement = doc.CreateElement("City")
city.InnerText = "Mercer Island"
Dim state As XmlElement = doc.CreateElement("State")
state.InnerText = "WA"
Dim postal As XmlElement = doc.CreateElement("Postal")
postal.InnerText = "68042"
Dim address As XmlElement = doc.CreateElement("Address")
address.AppendChild(street1)
address.AppendChild(city)
address.AppendChild(state)
address.AppendChild(postal)
Dim contact As XmlElement = doc.CreateElement("Contact")
contact.AppendChild(name)
contact.AppendChild(phone1)
contact.AppendChild(phone2)
contact.AppendChild(address)
Dim contacts As XmlElement = doc.CreateElement("Contacts")
contacts.AppendChild(contact)
doc.AppendChild(contacts)
Console.WriteLine(doc.OuterXml)
このスタイルのコーディングでは、XML ツリーの構造が非表示になります。 LINQ to XML では、構造をより適切に示す代替アプローチである 機能的な構築もサポートされています。 この方法は、 XElement コンストラクターと XAttribute コンストラクターを使用して実行できます。 Visual Basic では、XML リテラルを使用して行うこともできます。 この例では、関数型構築を使用した同じ XML ツリーの構築を示します。
XElement contacts =
new XElement("Contacts",
new XElement("Contact",
new XElement("Name", "Patrick Hines"),
new XElement("Phone", "206-555-0144",
new XAttribute("Type", "Home")),
new XElement("phone", "425-555-0145",
new XAttribute("Type", "Work")),
new XElement("Address",
new XElement("Street1", "123 Main St"),
new XElement("City", "Mercer Island"),
new XElement("State", "WA"),
new XElement("Postal", "68042")
)
)
);
Dim contacts = _
<Contacts>
<Contact>
<Name>Patrick Hines</Name>
<Phone Type="Home">206-555-0144</Phone>
<Phone Type="Work">425-555-0145</Phone>
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
</Contact>
</Contacts>
XML ツリーを構築するためにコードをインデントすると、基になる XML の構造が示されていることに注意してください。 Visual Basic バージョンでは、XML リテラルが使用されます。
詳細については、 XML ツリーを参照してください。
XML 要素を直接操作する
XML を使用してプログラミングする場合、主な焦点は通常、XML 要素と属性です。 LINQ to XML では、XML 要素と属性を直接操作できます。 たとえば次のことを実行できます。
- ドキュメント オブジェクトをまったく使用せずに XML 要素を作成します。 これにより、XML ツリーのフラグメントを操作する必要がある場合のプログラミングが簡略化されます。
- オブジェクトを XML ファイルから直接読み込みます。
-
T:System.Xml.Linq.XElement
オブジェクトをファイルまたはストリームにシリアル化します。
これを、XML ドキュメントが XML ツリーの論理コンテナーとして使用される W3C DOM と比較します。 DOM では、要素や属性を含む XML ノードを XML ドキュメントのコンテキストで作成する必要があります。 DOM で name 要素を作成するコードの一部を次に示します。
XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
doc.AppendChild(name);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
doc.AppendChild(name)
複数のドキュメントで要素を使用する場合は、ドキュメント間でノードをインポートする必要があります。 LINQ to XML を使用すると、この複雑さが回避されます。
LINQ to XML を使用する場合は、ドキュメントのルート レベルでコメントまたは処理命令を追加する場合にのみ、 XDocument クラスを使用します。
名前と名前空間の簡単な処理
名前、名前空間、および名前空間プレフィックスの処理は、通常、XML プログラミングの複雑な部分です。 LINQ to XML では、名前空間プレフィックスを処理する必要がなくなるので、名前と名前空間が簡略化されます。 名前空間プレフィックスを制御する場合は、次のことができます。 ただし、名前空間プレフィックスを明示的に制御しない場合、LINQ to XML ではシリアル化中に名前空間プレフィックスが必要な場合は割り当てられます。そうでない場合は、既定の名前空間を使用してシリアル化されます。 既定の名前空間が使用されている場合、結果のドキュメントには名前空間プレフィックスはありません。 詳細については、「 名前空間の概要」を参照してください。
DOM のもう 1 つの問題は、ノードの名前を変更できないことです。 代わりに、新しいノードを作成し、そのノードにすべての子ノードをコピーし、元のノード ID を失う必要があります。 LINQ to XML では、ノードで XName プロパティを設定できるため、この問題を回避できます。
XML 読み込みの静的メソッドのサポート
LINQ to XML を使用すると、インスタンス メソッドではなく静的メソッドを使用して XML を読み込むことができます。 これにより、読み込みと解析が簡略化されます。 詳細については、「 ファイルから XML を読み込む方法」を参照してください。
DTD コンストラクトのサポートの削除
LINQ to XML では、エンティティとエンティティ参照のサポートが削除され、XML プログラミングがさらに簡略化されます。 エンティティの管理は複雑であり、ほとんど使用しません。 サポートを削除すると、パフォーマンスが向上し、プログラミング インターフェイスが簡略化されます。 LINQ to XML ツリーが設定されると、すべての DTD エンティティが展開されます。
フラグメントのサポート
LINQ to XML では、 XmlDocumentFragment
クラスに相当するものは提供されません。 ただし、多くの場合、XmlDocumentFragment
の概念は、XNodeのIEnumerable<T>、またはXElementのIEnumerable<T>として入力されたクエリの結果によって処理できます。
XPathNavigator のサポート
LINQ to XML では、System.Xml.XPath名前空間の拡張メソッドを使用したXPathNavigatorのサポートが提供されます。 詳細については、System.Xml.XPath.Extensionsを参照してください。
空白とインデントのサポート
LINQ to XML は、DOM よりも単純に空白を処理します。
一般的なシナリオは、インデントされた XML を読み取り、空白テキスト ノードを使用せずにメモリ内 XML ツリーを作成し (つまり、空白を保持しない)、XML に対していくつかの操作を行い、XML をインデント付きで保存することです。 書式設定を使用して XML をシリアル化すると、XML ツリー内の重要な空白のみが保持されます。 これは LINQ to XML の既定の動作です。
もう 1 つの一般的なシナリオは、既に意図的にインデントされている XML の読み取りと変更です。 このインデントを何も変更したくない場合があります。 LINQ to XML では、次の方法でこれを行うことができます。
- XML の読み込みまたは解析時の空白の保持。
- XML をシリアル化するときに書式設定を無効にする。
LINQ to XML では、DOM と同様に、特殊なWhitespace ノード型を持つ代わりに、空白がXText ノードとして格納されます。
注釈のサポート
LINQ to XML 要素は、拡張可能な注釈セットをサポートします。 これは、スキーマ情報、要素が UI にバインドされているかどうかに関する情報、またはその他の種類のアプリケーション固有の情報など、要素に関するその他の情報を追跡するのに役立ちます。 詳細については、「 LINQ to XML 注釈」を参照してください。
スキーマ情報のサポート
LINQ to XML では、 System.Xml.Schema 名前空間の拡張メソッドを使用した XSD 検証がサポートされます。 XML ツリーが XSD に準拠していることを検証できます。 XML ツリーには、スキーマ検証後の情報セット (PSVI) を設定できます。 詳細については、「XSD とExtensionsを使用して検証する方法」を参照してください。
こちらも参照ください
.NET