XPathNavigator クラスには、XML ドキュメントからノードと値を削除するために使用する一連のメソッドが用意されています。 これらのメソッドを使用するには、 XPathNavigator オブジェクトを編集可能にする必要があります。つまり、 CanEdit プロパティを true
する必要があります。
XPathNavigatorXML ドキュメントを編集できるオブジェクトは、CreateNavigator クラスのXmlDocument メソッドによって作成されます。 XPathNavigator XPathDocument クラスによって作成されたオブジェクトは読み取り専用であり、XPathNavigator オブジェクトによって作成されたXPathDocument オブジェクトの編集メソッドを使用しようとすると、NotSupportedExceptionになります。
編集可能な XPathNavigator オブジェクトの作成の詳細については、「 XPathDocument と XmlDocument を使用した XML データの読み取り」を参照してください。
ノードの削除
XPathNavigator クラスは、XML ドキュメントからノードを削除するDeleteSelf メソッドを提供します。
ノードの削除
XPathNavigator クラスは、XPathNavigator オブジェクトが現在配置されている現在のノードを XML ドキュメントから削除するDeleteSelf メソッドを提供します。
DeleteSelf メソッドを使用してノードを削除すると、XmlDocument オブジェクトのルートからノードに到達できなくなります。 ノードが削除されると、 XPathNavigator は削除されたノードの親ノードに配置されます。
削除操作は、削除されたノードに配置されている XPathNavigator オブジェクトの位置には影響しません。 これらの XPathNavigator オブジェクトは、削除されたサブツリー内で移動できるという意味で有効ですが、 XPathNavigator クラスの通常のノード セット ナビゲーション メソッドを使用してメイン ノード ツリーに移動することはできません。
注
XPathNavigator クラスの MoveTo メソッドを使用して、これらのXPathNavigator オブジェクトをメイン ノード ツリーに戻すか、メイン ノード ツリーから削除されたサブツリーに移動できます。
次の例では、contosoBooks.xml
ファイルの最初のbook
要素のprice
要素は、DeleteSelf メソッドを使用して削除されます。
price
要素が削除された後のXPathNavigator オブジェクトの位置は、親book
要素にあります。
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.DeleteSelf()
Console.WriteLine("Position after delete: {0}", navigator.Name)
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.DeleteSelf();
Console.WriteLine("Position after delete: {0}", navigator.Name);
Console.WriteLine(navigator.OuterXml);
この例では、 contosoBooks.xml
ファイルを入力として受け取ります。
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
属性ノードの削除
属性ノードは、 DeleteSelf メソッドを使用して XML ドキュメントから削除されます。
属性ノードが削除されると、 XmlDocument オブジェクトのルート ノードから到達できなくなり、 XPathNavigator オブジェクトが親要素に配置されます。
既定の属性
属性の削除に使用されるメソッドに関係なく、XML ドキュメントの DTD または XML スキーマで既定の属性として定義されている属性の削除には特別な制限があります。 既定の属性は、所属する要素も削除されない限り削除できません。 既定の属性は、既定の属性が宣言されている要素に対して常に存在します。その結果、既定の属性を削除すると、置換属性が要素に挿入され、宣言された既定値に初期化されます。
値の削除
XPathNavigator クラスは、XML ドキュメントから型指定されていない値と型指定された値を削除するためのSetValueメソッドとSetTypedValue メソッドを提供します。
型指定されていない値の削除
SetValueメソッドは、パラメーターとして渡された型指定されていないstring
値を、XPathNavigator オブジェクトが現在配置されているノードの値として挿入するだけです。
SetValue メソッドに空の文字列を渡すと、現在のノードの値が削除されます。
次の例では、SetValue メソッドを使用して、contosoBooks.xml
ファイル内の最初のbook
要素のprice
要素の値を削除します。
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetValue("")
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetValue("");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
この例では、 contosoBooks.xml
ファイルを入力として受け取ります。
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
型指定された値の削除
ノードの型が W3C XML スキーマ単純型の場合、 SetTypedValue メソッドによって挿入された新しい値は、値が設定される前に単純型のファセットに対してチェックされます。 ノードの型に従って新しい値が無効な場合 (たとえば、型が-1
の要素にxs:positiveInteger
の値を設定するなど)、例外が発生します。
SetTypedValueメソッドは、パラメーターとしてnull
渡すこともできません。 その結果、型指定されたノードの値を削除するには、ノードのスキーマ型に準拠する必要があります。
次の例では、値を 0
に設定して、SetTypedValue メソッドを使用して、contosoBooks.xml
ファイル内の最初のbook
要素のprice
要素の値を削除します。 ノードの値は削除されませんが、書籍の価格は xs:decimal
のデータ型に従って削除されています。
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetTypedValue(0)
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetTypedValue(0);
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
名前空間ノード
名前空間ノードは、 XmlDocument オブジェクトから削除できません。 DeleteSelf メソッドを使用して名前空間ノードを削除しようとすると、例外が発生します。
InnerXml プロパティと OuterXml プロパティ
InnerXml クラスのOuterXmlプロパティとXPathNavigatorプロパティは、XPathNavigator オブジェクトが現在配置されているノードの XML マークアップを変更します。
InnerXml プロパティは、XPathNavigator オブジェクトが現在配置されている子ノードの XML マークアップを、指定された XML string
の解析された内容と共に変更します。 同様に、 OuterXml プロパティは、 XPathNavigator オブジェクトが現在配置されている子ノードと現在のノード自体の XML マークアップを変更します。
このトピックで説明するメソッドに加えて、 InnerXml プロパティと OuterXml プロパティを使用して、XML ドキュメントからノードと値を削除できます。 InnerXmlプロパティとOuterXmlプロパティを使用してノードを変更する方法の詳細については、「XPathNavigator を使用した XML データの変更」トピックを参照してください。
XML ドキュメントの保存
このトピックで説明するメソッドの結果として XmlDocument オブジェクトに加えられた変更の保存は、 XmlDocument クラスのメソッドを使用して実行されます。 XmlDocument オブジェクトに加えられた変更の保存の詳細については、「ドキュメントの保存と書き込み」を参照してください。
こちらも参照ください
.NET