DOM の属性へのアクセス
属性は要素のプロパティであり、要素の子ではありません。この区別は、メソッドを使用して DOM の兄弟ノード、親ノード、および子ノードに移動する場合に重要になります。たとえば、PreviousSibling メソッドと NextSibling メソッドは、要素から属性への移動、または属性間の移動には使用しません。属性は要素のプロパティであり、要素によって所有されているため、OwnerElement プロパティを持ちますが、parentNode プロパティはありません。また、移動には専用のメソッドを使います。
現在のノードが要素のとき、その要素に関連付けられている属性があるかどうかを調べるには、HasAttribute メソッドを使用します。要素に属性がある場合は、各種のメソッドで属性にアクセスできます。XmlElement の GetAttribute メソッドと GetAttributeNode メソッドを使用して要素から 1 つの属性を取得するか、すべての属性をコレクションに取得できます。コレクションに対して反復処理を行う必要がある場合は、コレクションを取得すると便利です。要素のすべての属性が必要な場合は、要素の Attributes プロパティを使用して、すべての属性をコレクションに取得できます。
コレクションへのすべての属性の取得
要素ノードのすべての属性をコレクションに取得するには、XmlElement.Attributes プロパティを呼び出します。XmlElement.Attributes プロパティにより、要素のすべての属性を含む XmlAttributeCollection を取得できます。XmlAttributeCollection クラスは XmlNamedNode マップから継承されます。このため、コレクションで使用できるメソッドとプロパティには、ItemOf プロパティや Append メソッドなど、XmlAttributeCollection クラスに特有のメソッドやプロパティだけでなく、名前付きノード マップで使用できるメソッドとプロパティも含まれています。属性コレクション内の各項目は、XmlAttribute ノードを表します。要素の属性の数を調べるには、XmlAttributeCollection を取得し、Count プロパティを使用して、そのコレクションに含まれる XmlAttribute ノードの数を調べます。
属性コレクションを取得し、Count メソッドをループ インデックスにして反復処理を行うコード例を次に示します。このコードは、その後、コレクションから属性を 1 つ取得して、その値を表示します。
Imports System
Imports System.IO
Imports System.Xml
public class Sample
public shared sub Main()
Dim doc as XmlDocument = new XmlDocument()
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>" & _
"<title>The Handmaid's Tale</title>" & _
"<price>14.95</price>" & _
"</book>")
' Move to an element.
Dim myElement as XmlElement = doc.DocumentElement
' Create an attribute collection from the element.
Dim attrColl as XmlAttributeCollection = myElement.Attributes
' Show the collection by iterating over it.
Console.WriteLine("Display all the attributes in the collection...")
Dim i as integer
for i=0 to attrColl.Count-1
Console.Write("{0} = ", attrColl.ItemOf(i).Name)
Console.Write("{0}", attrColl.ItemOf(i).Value)
Console.WriteLine()
next
' Retrieve a single attribute from the collection; specifically, the
' attribute with the name "misc".
Dim attr as XmlAttribute = attrColl("misc")
' Retrieve the value from that attribute.
Dim miscValue as String = attr.InnerXml
Console.WriteLine("Display the attribute information.")
Console.WriteLine(miscValue)
end sub
end class
[C#]
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>" +
"<title>The Handmaid's Tale</title>" +
"<price>14.95</price>" +
"</book>");
// Move to an element.
XmlElement myElement= doc.DocumentElement;
// Create an attribute collection from the element.
XmlAttributeCollection attrColl = myElement.Attributes;
// Show the collection by iterating over it.
Console.WriteLine("Display all the attributes in the collection...");
for (int i=0; i < attrColl.Count; i++)
{
Console.Write("{0} = ", attrColl[i].Name);
Console.Write("{0}", attrColl[i].Value);
Console.WriteLine();
}
// Retrieve a single attribute from the collection; specifically, the
// attribute with the name "misc".
XmlAttribute attr = attrColl["misc"];
// Retrieve the value from that attribute.
String miscValue = attr.InnerXml;
Console.WriteLine("Display the attribute information.");
Console.WriteLine(miscValue);
}
}
この例を実行すると、次の出力が表示されます。
出力
コレクション内のすべての属性を表示します。
genre = novel
ISBN = 1-861001-57-5
misc = sale item
Display the attribute information.
sale item
属性コレクションの情報は、名前またはインデックス番号によって取得できます。上の例では、名前を指定してデータを取得しています。次の例では、インデックス番号を指定してデータを取得します。
XmlAttributeCollection はコレクションであり、名前またはインデックスを使って反復処理ができるため、この例ではゼロから始まるインデックスを使用してコレクションの最初の属性を選択しています。入力には、baseuri.xml というファイルを使用しています。
入力
<!-- XML fragment -->
<book genre="novel">
<title>Pride And Prejudice</title>
</book>
[Visual Basic]
Option Explicit
Option Strict
Imports System
Imports System.IO
Imports System.Xml
Public Class Sample
Public Shared Sub Main()
' Create the XmlDocument.
Dim doc As New XmlDocument()
doc.Load("https://localhost/baseuri.xml")
' Display information on the attribute node. The value
' returned for BaseURI is 'https://localhost/baseuri.xml'.
Dim attr As XmlAttribute = doc.DocumentElement.Attributes(0)
Console.WriteLine("Name of the attribute: {0}", attr.Name)
Console.WriteLine("Base URI of the attribute: {0}", attr.BaseURI)
Console.WriteLine("The value of the attribtue: {0}", attr.InnerText)
End Sub 'Main
End Class 'Sample
[C#]
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
// Create the XmlDocument.
XmlDocument doc = new XmlDocument();
doc.Load("https://localhost/baseuri.xml");
// Display information on the attribute node. The value
// returned for BaseURI is 'https://localhost/baseuri.xml'.
XmlAttribute attr = doc.DocumentElement.Attributes[0];
Console.WriteLine("Name of the attribute: {0}", attr.Name);
Console.WriteLine("Base URI of the attribute: {0}", attr.BaseURI);
Console.WriteLine("The value of the attribtue: {0}", attr.InnerText);
}
}
個別の属性ノードの取得
要素から 1 つの属性ノードを取得するには、XmlElement.GetAttributeNode メソッドを使用します。このメソッドは、XmlAttribute 型のオブジェクトを返します。XmlAttribute の取得後は、XmlAttribute クラスのすべてのメソッドとプロパティを使用できます。たとえば、OwnerElement で、どの要素に所属しているかを調べることができます。
Imports System
Imports System.IO
Imports System.Xml
public class Sample
public shared sub Main()
Dim doc as XmlDocument = new XmlDocument()
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>" & _
"<title>The Handmaid's Tale</title>" & _
"<price>14.95</price>" & _
"</book>")
' Move to an element.
Dim root as XmlElement
root = doc.DocumentElement
' Get an attribute.
Dim attr as XmlAttribute
attr = root.GetAttributeNode("ISBN")
' Display the value of the attribute.
Dim attrValue as string
attrValue = attr.InnerXml
Console.WriteLine(attrValue)
end sub
end class
[C#]
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<book genre='novel' ISBN='1-861003-78' misc='sale item'>" +
"<title>The Handmaid's Tale</title>" +
"<price>14.95</price>" +
"</book>");
// Move to an element.
XmlElement root = doc.DocumentElement;
// Get an attribute.
XmlAttribute attr = root.GetAttributeNode("ISBN");
// Display the value of the attribute.
String attrValue = attr.InnerXml;
Console.WriteLine(attrValue);
}
}
前の例で示したように、属性コレクションから 1 つの属性ノードを取得することもできます。インデックス番号を指定して、XML ドキュメント ツリーのルートから 1 つの属性を取得する処理を 1 行で記述した例を次に示します。DocumentElement プロパティを使用します。
XmlAttribute attr = doc.DocumentElement.Attributes[0];