使用 XPathNavigator 删除 XML 数据

XPathNavigator 类提供一组用于从 XML 文档中删除节点和值的方法。 若要使用这些方法, XPathNavigator 对象必须可编辑,也就是说,其 CanEdit 属性必须为 true

XPathNavigator 可以编辑 XML 文档的对象由 CreateNavigator 类的方法 XmlDocument 创建。 XPathNavigatorXPathDocument创建的对象是只读的,并且任何尝试使用对象创建的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 对象位于父元素上。

默认属性

无论用于删除属性的方法如何,在删除 XML 文档的 DTD 或 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 插入的新值将针对简单类型的分面进行检查,然后再设置该值。 如果新值根据节点的类型无效(例如,在类型为-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类的OuterXmlXPathNavigator属性更改XPathNavigator对象当前定位节点的 XML 标记。

InnerXml 属性将给定 XML XPathNavigator 的解析内容应用于该对象当前定位的子节点,从而更改其 XML 标记。 同样,属性 OuterXml 更改对象当前位于的子节点 XPathNavigator 的 XML 标记以及当前节点本身。

除了本主题中描述的方法,InnerXmlOuterXml 属性还可以用于从 XML 文档中删除节点和值。 有关使用 InnerXmlOuterXml 属性修改节点的详细信息,请参阅 使用 XPathNavigator 修改 XML 数据 主题。

保存 XML 文档

使用XmlDocument类的方法执行对对象所做的更改XmlDocument,因为本主题中所述的方法的结果。 有关保存对 XmlDocument 对象所做的更改的详细信息,请参阅 “保存和写入文档”。

另请参阅