類別 XPathNavigator 提供一組方法,用來從 XML 檔中移除節點和值。 若要使用這些方法, XPathNavigator 對象必須可編輯,也就是說,其 CanEdit 屬性必須是 true。
XPathNavigator 可以編輯 XML 檔的物件是由 CreateNavigator 類別的 XmlDocument 方法所建立。 XPathNavigator類別所XPathDocument建立的物件是唯讀的,而且任何嘗試使用 物件所XPathNavigator建立之對象的編輯方法XPathDocument會導致 NotSupportedException。
如需建立可 XPathNavigator 編輯對象的詳細資訊,請參閱 使用 XPathDocument 和 XmlDocument 讀取 XML 數據。
移除節點
類別 XPathNavigator 提供 DeleteSelf 從 XML 檔案移除節點的方法。
拿掉節點
類別 XPathNavigator 提供 DeleteSelf 方法來刪除 XML 文件中物件 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 對象位於父元素上。
默認屬性
不論用來移除屬性的方法為何,移除定義為 DTD 或 XML 架構中 XML 檔案之預設屬性的屬性有特殊限制。 除非也移除其所屬的元素,否則無法移除預設屬性。 被宣告預設屬性的元素,其預設屬性始終存在。因此,刪除預設屬性時,會在該元素中插入一個取代屬性,並將其初始化為已宣告的預設值。
移除數值
類別 XPathNavigator 提供 SetValue 和 SetTypedValue 方法,用於從 XML 文件中移除不具類型和具類型的值。
移除無類型的值
方法 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 的新值會在設定值之前,針對簡單類型的 Facet 進行檢查。 如果新值根據節點的類型無效(例如,在類型為-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 屬性會更改目前物件所在的子節點和目前節點本身的 XML 標記。
除了本主題所述的方法之外, InnerXml 和 OuterXml 屬性也可以用來從 XML 檔中移除節點和值。 如需有關使用InnerXml和OuterXml屬性來修改節點的詳細資訊,請參閱使用 XPathNavigator 修改 XML 資料主題。
儲存 XML 檔
使用 類別的方法,儲存對 物件所做的 XmlDocument 變更,因為本主題所述的方法 XmlDocument 會執行。 如需儲存對物件所做的 XmlDocument 變更的詳細資訊,請參閱 儲存和寫入檔。