Удаление XML-данных с помощью XPathNavigator

Класс XPathNavigator располагает набором методов, используемых для удаления узлов и значений из XML-документа. Для использования этих методов необходимо сделать редактируемым объект XPathNavigator, то есть установить для свойства CanEdit значение true.

Объекты XPathNavigator для правки XML-документа создаются с помощью метода CreateNavigator класса XmlDocument. Объекты XPathNavigator, созданные классом XPathDocument, доступны только для чтения, и любая попытка вызова методов редактирования объекта XPathNavigator, созданного объектом XPathDocument, приводит к возникновению исключения NotSupportedException.

Дополнительные сведения о доступных только для чтения и изменяемых объектах XPathNavigator см. в руководстве по чтению данных XML с помощью XPathDocument и XmlDocument.

Удаление узлов

Класс XPathNavigator представляет метод DeleteSelf для удаления узлов из XML-документа.

Удаление узла

Класс XPathNavigator представляет метод DeleteSelf для удаления узлов текущего узла, на котором в данное время позиционирован объект XPathNavigator, из XML-документа.

Узел, удаленный с помощью метода 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>

Удаление узла атрибута

Узлы атрибута удаляются из 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-документа. Дополнительные сведения об использовании свойств OuterXml и для изменения узлов см. в InnerXmlруководстве по изменению данных XML с помощью XPathNavigator.

Сохранение XML-документа

Сохранение изменений, внесенных в объект XmlDocument в результате выполнения описанных в данном разделе методов, выполняется с помощью методов класса XmlDocument. Дополнительные сведения о сохранении изменений, внесенных в объект XmlDocument, см. в руководстве по созданию и сохранению документов.

См. также