使用 XPathNavigator 移除 XML 数据
XPathNavigator 类提供一组方法用于移除 XML 文档中的节点和值。 要使用这些方法,XPathNavigator 对象必须可编辑,即其 CanEdit 属性必须为 true
。
可以编辑 XML 文档的 XPathNavigator 对象由 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 对象将位于父元素上。
默认属性
无论用于移除属性的方法是什么,当移除在 XML 文档的 DTD 或 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 方法插入的新值。 如果新值不符合节点的类型(例如在类型为 -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 属性更改 XPathNavigator 对象当前所处的子节点以及给定 XML string
的已分析内容的 XML 标记。 同样,OuterXml 属性更改 XPathNavigator 对象当前所处的子节点以及当前节点本身的 XML 标记。
除了本主题中所述的方法之外,InnerXml 和 OuterXml 属性也可以用于移除 XML 文档中的节点和值。 若要详细了解如何使用 InnerXml 和 OuterXml 属性修改节点,请参阅使用 XPathNavigator 修改 XML 数据主题。
保存 XML 文档
使用 XmlDocument 类的方法保存本主题中所述的方法对 XmlDocument 对象的更改。 若要详细了解如何保存对 XmlDocument 对象所做的更改,请参阅保存和编写文档。