XPathNavigator による XML データの削除

XPathNavigator クラスは、XML ドキュメントからノードを削除するためのメソッドのセットを提供します。 これらのメソッドを使用するには、XPathNavigator オブジェクトが編集可能である必要があります。つまり、その CanEdit プロパティを true にする必要があります。

XML ドキュメントを編集できる XPathNavigator オブジェクトは、CreateNavigator クラスの XmlDocument メソッドによって作成されます。 XPathNavigator クラスによって作成される XPathDocument オブジェクトは読み取り専用であり、XPathNavigator オブジェクトによって作成される XPathDocument オブジェクトの編集メソッドを使用しようとすると、NotSupportedException が発生します。

編集可能な XPathNavigator オブジェクトの作成方法については、「XPathDocument および XmlDocument を使用した XML データの読み取り」を参照してください。

ノードの削除

XPathNavigator クラスは、XML ドキュメントからノードを削除する DeleteSelf メソッドを提供します。

1 つのノードの削除

XPathNavigator クラスは、XML ドキュメントから、DeleteSelf オブジェクトが現在位置している現在のノードを削除する XPathNavigator メソッドを提供します。

DeleteSelf メソッドを使用してノードを削除した後は、XmlDocument オブジェクトのルートからそのノードに到達することはできません。 ノードの削除後、XPathNavigator は削除されたノードの親ノード上に位置します。

削除操作により、削除されたノード上に位置していた XPathNavigator オブジェクトの位置に影響はありません。 これらの XPathNavigator オブジェクトは削除されたサブツリー内を移動できるという点で有効ですが、XPathNavigator クラスの通常のノード セットの移動メソッドを使用して、主ノード ツリーには移動できません。

注意

MoveTo クラスの XPathNavigator メソッドは、これらの XPathNavigator オブジェクトを主ノード ツリーに戻したり、主ノード ツリーから削除されたサブツリーに移動したりするために使用できます。

次の例では、price ファイルの最初の book 要素の contosoBooks.xml 要素を、DeleteSelf メソッドを使用して削除します。 XPathNavigator 要素が削除された後の price オブジェクトの位置は、親の 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 メソッドに空の文字列を渡すと、現在のノードの値が削除されます。

次の例では、price メソッドを使用して、book ファイル内の最初の contosoBooks.xml 要素の SetValue 要素の値を削除します。

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 を渡すことはできません。 結果として、型指定されたノードの値の削除は、ノードのスキーマの型に従う必要があります。

次の例では、price メソッドを使用して、値を book に設定することにより、contosoBooks.xml ファイル内の最初の SetTypedValue 要素の 0 要素の値を削除します。 ノードの値は削除されませんが、本の価格はそのデータ型 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 プロパティは、与えられた XML XPathNavigator の解析済みの内容を使用して string オブジェクトの現在位置にある子ノードの XML マークアップを変更します。 同様に、OuterXml プロパティは、XPathNavigator オブジェクトの現在位置にある子ノードと現在のノード自体の XML マークアップを変更します。

このトピックで説明したメソッドに加えて、InnerXml プロパティと OuterXml プロパティは、XML ドキュメントからノードと値を削除するために使用できます。 InnerXml プロパティと OuterXml プロパティを使用してノードを変更する方法の詳細については「XpathNavigator による XML データの変更」のトピックを参照してください。

XML ドキュメントの保存

ここに記載されているメソッドによる XmlDocument オブジェクトに対する変更の保存は、XmlDocument クラスのメソッドを使用して実行されます。 XmlDocument オブジェクトに対する変更の保存に関する詳細については、「ドキュメントの保存と書き込み」を参照してください。

関連項目