使用 XPathNavigator 移除 XML 資料
XPathNavigator 類別提供一組可用來從 XML 文件移除節點及值的方法。 為了使用這些方法,XPathNavigator 物件必須是可編輯的,也就是說,它的 CanEdit 屬性必須為 true。
可編輯 XML 文件的 XPathNavigator 物件是由 XmlDocument 類別的 CreateNavigator 方法所建立。 由 XPathDocument 類別建立的 XPathNavigator 物件是唯讀的,而且如果嘗試使用由 XPathDocument 物件建立之 XPathNavigator 物件的編輯方法,則會導致 NotSupportedException。
如需建立可編輯 XPathNavigator 物件的詳細資訊,請參閱 使用 XPathDocument 及 XmlDocument 讀取 XML 資料。
移除節點
XPathNavigator 類別提供 DeleteSelf 方法,以從 XML 文件移除節點。
移除節點
XPathNavigator 類別提供 DeleteSelf 方法,以從 XML 文件刪除 XPathNavigator 物件目前所位於的目前節點。
在使用 DeleteSelf 方法刪除節點之後,就無法從 XmlDocument 物件的根存取此節點。 刪除節點之後,XPathNavigator 定位於已刪除節點的父節點上。
刪除作業不會影響定位於已刪除節點上任何 XPathNavigator 物件的位置。 這些 XPathNavigator 物件是有效的,這表示它們可在已刪除的樹狀子目錄內移動,但無法使用 XPathNavigator 類別的一般節點集巡覽方法,移至主節點樹狀目錄。
![]() |
---|
XPathNavigator 類別的 MoveTo 方法可用來將這些 XPathNavigator 物件移回主節點樹狀目錄,或從主節點樹狀目錄移至刪除的樹狀子目錄。 |
在下列範例中,使用 DeleteSelf 方法,刪除 contosoBooks.xml 檔案之第一個 book 項目的 price 項目。 刪除 price 項目之後,XPathNavigator 物件的位置在父 book 項目上。
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://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="https://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 類別提供 SetValue 及 SetTypedValue 方法,以從 XML 文件移除不具型別值及具型別值。
移除不具型別值
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", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");
navigator.SetValue("");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
範例將 contosoBooks.xml 檔案做為輸入。
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://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 結構描述簡單型別時,會根據簡單型別的 Facet,對 SetTypedValue 方法插入的新值執行設定前的檢查。 如果根據節點的型別,新值無效 (例如,在型別為 xs:positiveInteger 的項目上設定 -1 值),則會導致例外狀況。 SetTypedValue 方法也無法將 null 當做參數傳遞。 因此,移除具型別節點的值時必須遵守節點的結構描述型別。
下列範例使用 SetTypedValue 方法,將值設為 0,來移除 contosoBooks.xml 檔案中第一個 book 項目的 price 項目值。 不會移除節點的值,但是根據書籍之價格的 xs:decimal 資料型別,已移除該價格。
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("https://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", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")
navigator.SetTypedValue(0)
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");
navigator.SetTypedValue(0);
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
命名空間節點
無法從 XmlDocument 物件刪除命名空間節點。 嘗試使用 DeleteSelf 方法刪除命名空間節點,會導致例外狀況。
InnerXml 及 OuterXml 屬性
XPathNavigator 類別的 InnerXml 及 OuterXml 屬性會變更 XPathNavigator 物件目前所在之節點的 XML 標記。
InnerXml 屬性會變更 XPathNavigator 物件目前所在之子節點的 XML 標記,以及指定 XML string 的已剖析內容。 同樣地,OuterXml 屬性會變更 XPathNavigator 物件目前所在之子節點的 XML 標記,以及目前節點本身。
除了本主題中所說明的方法之外,還可以使用 InnerXml 及 OuterXml 屬性,從 XML 文件移除節點及值。 如需使用 InnerXml 及 OuterXml 屬性修改節點的詳細資訊,請參閱 使用 XPathNavigator 修改 XML 資料 主題。
儲存 XML 文件
使用 XmlDocument 類別的方法,將用本主題中說明之方法對 XmlDocument 物件所做的變更儲存下來。 如需儲存 XmlDocument 物件之變更的詳細資訊,請參閱 儲存與寫入文件。