Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс XPathNavigator предоставляет набор методов, используемых для удаления узлов и значений из XML-документа. Чтобы использовать эти методы, XPathNavigator объект должен быть редактируемым, то есть его CanEdit свойство должно быть true
.
XPathNavigator объекты, которые могут изменять XML-документ, создаются методом CreateNavigatorXmlDocument класса. XPathNavigator объекты, созданные классом XPathDocument, доступны только для чтения, и любая попытка использовать методы редактирования объекта XPathNavigator, созданного объектом XPathDocument, приводит к NotSupportedException ошибке.
Дополнительные сведения о создании редактируемых XPathNavigator объектов см. в статье "Чтение XML-данных с помощью XPathDocument и XmlDocument".
Удаление узлов
Класс 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>
Удаление узла атрибутов
Узлы атрибутов удаляются из XML-документа с помощью DeleteSelf метода.
После удаления узла атрибута он больше недоступен из корневого 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>
Удаление типизированных значений
Если тип узла является простым типом схемы XML W3C, новое значение, вставленное 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 изменяют XML-разметку узлов, над которыми в настоящее время находится объект XPathNavigator.
Свойство InnerXml изменяет XML-разметку дочерних узлов XPathNavigator, на которых сейчас находится объект, используя проанализированное содержимое заданного XML string
.
OuterXml Аналогичным образом свойство изменяет XML-разметку дочерних XPathNavigator узлов, на которые в настоящее время размещается объект, а также на текущем узле.
Помимо методов, описанных в этом разделе, свойства InnerXml и OuterXml используются для удаления узлов и значений из XML-документа. Дополнительные сведения об использовании InnerXml и OuterXml свойствах для изменения узлов см. в разделе " Изменение XML-данных с помощью XPathNavigator ".
Сохранение XML-документа
Сохранение изменений, XmlDocument внесенных в объект в результате методов, описанных в этом разделе, выполняется с помощью методов XmlDocument класса. Дополнительные сведения о сохранении изменений, внесенных XmlDocument в объект, см. в разделе "Сохранение и запись документа".