共用方式為


使用 XPathNavigator 移除 XML 資料

類別 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 類別的一般節點集流覽方法移動到主要節點樹。

備註

類別 MoveToXPathNavigator 方法可用來將這些 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 提供 SetValueSetTypedValue 方法,用於從 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 屬性

類別InnerXmlOuterXmlXPathNavigator 屬性會變更物件目前所在的節點 XPathNavigator XML 標記。

InnerXml 屬性會根據指定的 XML XPathNavigator 剖析內容,變更物件 string 目前所在子節點的 XML 標記。 同樣地,OuterXml 屬性會更改目前物件所在的子節點和目前節點本身的 XML 標記。

除了本主題所述的方法之外, InnerXmlOuterXml 屬性也可以用來從 XML 檔中移除節點和值。 如需有關使用InnerXmlOuterXml屬性來修改節點的詳細資訊,請參閱使用 XPathNavigator 修改 XML 資料主題。

儲存 XML 檔

使用 類別的方法,儲存對 物件所做的 XmlDocument 變更,因為本主題所述的方法 XmlDocument 會執行。 如需儲存對物件所做的 XmlDocument 變更的詳細資訊,請參閱 儲存和寫入檔

另請參閱