Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kelas XPathNavigator menyediakan sekumpulan metode yang digunakan untuk memodifikasi simpul dan nilai dalam dokumen XML. Untuk menggunakan metode ini, XPathNavigator objek harus dapat diedit, artinya, propertinya CanEdit harus true.
XPathNavigator objek yang dapat mengedit dokumen XML dibuat oleh CreateNavigator metode XmlDocument kelas. XPathNavigator objek yang dibuat oleh XPathDocument kelas bersifat baca-saja dan setiap upaya untuk menggunakan metode pengeditan objek yang XPathNavigatorXPathDocument dibuat oleh objek menghasilkan NotSupportedException.
Untuk informasi selengkapnya tentang membuat objek yang dapat diedit XPathNavigator , lihat Membaca Data XML menggunakan XPathDocument dan XmlDocument.
Memodifikasi Simpul
Teknik sederhana untuk mengubah nilai simpul adalah menggunakan metode SetValue dan SetTypedValue dari kelas XPathNavigator.
Tabel berikut mencantumkan efek metode ini pada jenis node yang berbeda.
| XPathNodeType | Data telah diubah |
|---|---|
| Root | Tidak didukung. |
| Element | Isi dari elemen. |
| Attribute | Nilai atribut . |
| Text | Isi teks. |
| ProcessingInstruction | Konten, tidak termasuk target. |
| Comment | Isi komentar. |
| Namespace | Tidak didukung. |
Kelas ini XPathNavigator juga menyediakan sekumpulan metode yang digunakan untuk menyisipkan dan menghapus simpul. Untuk informasi selengkapnya tentang menyisipkan dan menghapus simpul dari dokumen XML, lihat Menyisipkan Data XML menggunakan XPathNavigator dan Menghapus Data XML menggunakan topik XPathNavigator .
Memodifikasi Nilai yang Tidak Bertipe
Metode SetValue ini hanya menyisipkan nilai yang tidak diketik string yang diteruskan sebagai parameter sebagai nilai simpul XPathNavigator tempat objek saat ini diposisikan. Nilai disisipkan tanpa jenis apa pun atau tanpa memverifikasi bahwa nilai baru valid sesuai dengan jenis simpul jika informasi skema tersedia.
Dalam contoh berikut, SetValue metode ini digunakan untuk memperbarui semua price elemen dalam contosoBooks.xml file.
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
if (nav.Value == "11.99")
{
nav.SetValue("12.99");
}
}
Console.WriteLine(navigator.OuterXml);
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
For Each nav As XPathNavigator In navigator.Select("//bk:price", manager)
If nav.Value = "11.99" Then
nav.SetValue("12.99")
End If
Next
Console.WriteLine(navigator.OuterXml)
Contoh mengambil contosoBooks.xml file sebagai input.
<?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>
Memodifikasi Nilai Bertipe
Ketika jenis node adalah jenis sederhana dari Skema XML W3C, nilai baru yang dimasukkan oleh metode SetTypedValue diperiksa dengan faset dari jenis sederhana sebelum nilai ditetapkan. Jika nilai baru tidak valid sesuai dengan jenis simpul (misalnya, mengatur nilai -1 pada elemen yang jenisnya xs:positiveInteger), nilai tersebut menghasilkan pengecualian.
Contoh berikut mencoba mengubah nilai elemen pertama price dalam file book menjadi nilai contosoBooks.xml. Karena jenis Skema XML dari price elemen didefinisikan sebagai xs:decimal dalam contosoBooks.xsd file, ini menghasilkan pengecualian.
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(DateTime.Now)
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(DateTime.Now);
Contoh mengambil contosoBooks.xml file sebagai input.
<?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>
Contohnya juga mengambil contosoBooks.xsd sebagai input.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Efek Pengeditan Data XML yang Dititik Dengan Kuat
Kelas XPathNavigator menggunakan Skema XML W3C sebagai dasar untuk mendeskripsikan XML bertipe kuat. Elemen dan atribut dapat diannotasi dengan informasi jenis berdasarkan validasi terhadap dokumen Skema XML W3C. Elemen yang dapat berisi elemen atau atribut lain disebut jenis kompleks, sementara yang hanya dapat berisi konten tekstual disebut jenis sederhana.
Nota
Atribut hanya dapat memiliki jenis sederhana.
Elemen atau atribut dapat dianggap valid skema jika sesuai dengan semua aturan khusus untuk definisi jenisnya. Elemen yang memiliki jenis xs:int sederhana harus berisi nilai numerik antara -2147483648 dan 2147483647 agar valid skema. Untuk jenis kompleks, validitas skema elemen bergantung pada validitas skema elemen anak dan atributnya. Dengan demikian, jika elemen valid terhadap definisi jenis kompleksnya, semua elemen dan atribut turunannya valid terhadap definisi jenisnya. Serupa, jika bahkan satu saja elemen turunan atau atribut dari suatu elemen tidak valid terhadap definisi jenisnya, atau memiliki validitas tidak diketahui, elemen tersebut juga tidak valid atau memiliki validitas tidak diketahui.
Mengingat bahwa validitas sebuah elemen bergantung pada validitas elemen anak dan atributnya, modifikasi pada keduanya akan mengubah validitas elemen tersebut jika sebelumnya valid. Secara khusus, jika elemen turunan atau atribut elemen dimasukkan, diperbarui, atau dihapus, maka validitas elemen menjadi tidak diketahui. Ini diwakili oleh pengaturan properti Validity dari elemen SchemaInfo ke NotKnown. Selain itu, efek ini bertingkat ke atas secara rekursif di seluruh dokumen XML, karena validitas elemen induk elemen (dan elemen induknya, dan sebagainya) juga menjadi tidak diketahui.
Untuk informasi selengkapnya tentang validasi skema dan XPathNavigator kelas, lihat Validasi Skema menggunakan XPathNavigator.
Memodifikasi Atribut
Metode SetValue dan SetTypedValue dapat digunakan untuk memodifikasi node atribut yang tidak dijenis dan ditik serta jenis node lain yang tercantum di bagian "Memodifikasi Simpul".
Contoh berikut mengubah nilai genre atribut elemen pertama book dalam books.xml file.
Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", String.Empty)
navigator.MoveToChild("book", String.Empty)
navigator.MoveToAttribute("genre", String.Empty)
navigator.SetValue("non-fiction")
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", String.Empty);
navigator.MoveToChild("book", String.Empty);
navigator.MoveToAttribute("genre", String.Empty);
navigator.SetValue("non-fiction");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
Untuk informasi selengkapnya tentang metode SetValue dan SetTypedValue, lihat bagian "Memodifikasi Nilai Tidak Bertipe" dan "Memodifikasi Nilai Bertipe".
Properti InnerXml dan OuterXml
Properti InnerXml dan OuterXml dari kelas XPathNavigator mengubah markup XML dari simpul di mana objek XPathNavigator berada saat ini.
Properti InnerXml mengubah markup XML dari simpul anak tempat XPathNavigator objek saat ini diposisikan dengan konten XML string yang diurai. Demikian pula, properti OuterXml mengubah markup XML dari simpul anak yang ditempati objek XPathNavigator saat ini serta simpul saat ini itu sendiri.
Contoh berikut menggunakan OuterXml properti untuk mengubah nilai price elemen dan menyisipkan atribut baru discount pada elemen pertama book dalam contosoBooks.xml file.
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.OuterXml = "<price discount=\"0\">10.99</price>"
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.OuterXml = "<price discount=\"0\">10.99</price>";
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
Contoh mengambil contosoBooks.xml file sebagai input.
<?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>
Memodifikasi Node Namespace
Dalam Model Objek Dokumen (DOM), deklarasi namespace diperlakukan seolah-olah merupakan atribut reguler yang dapat disisipkan, diperbarui, dan dihapus. Kelas XPathNavigator tidak mengizinkan operasi tersebut pada simpul namespace layanan karena mengubah nilai simpul namespace dapat mengubah identitas elemen dan atribut dalam cakupan node namespace seperti yang diilustrasikan dalam contoh berikut.
<root xmlns="http://www.contoso.com">
<child />
</root>
Jika contoh XML di atas diubah dengan cara berikut, ini secara efektif mengganti nama setiap elemen dalam dokumen karena nilai URI namespace setiap elemen diubah.
<root xmlns="urn:contoso.com">
<child />
</root>
Menyisipkan simpul namespace yang tidak bertentangan dengan deklarasi namespace pada cakupan tempat simpul tersebut disisipkan diizinkan oleh XPathNavigator kelas. Dalam hal ini, deklarasi namespace tidak dideklarasikan pada cakupan yang lebih rendah dalam dokumen XML dan tidak menghasilkan penggantian nama seperti yang diilustrasikan dalam contoh berikut.
<root xmlns:a="http://www.contoso.com">
<parent>
<a:child />
</parent>
</root>
Jika contoh XML di atas diubah dengan cara berikut, deklarasi namespace disebarkan dengan benar di seluruh dokumen XML di luar cakupan deklarasi namespace lainnya.
<root xmlns:a="http://www.contoso.com">
<parent a:parent-id="1234" xmlns:a="http://www.contoso.com/parent-id">
<a:child xmlns:a="http://www.contoso.com/" />
</parent>
</root>
Dalam contoh XML di atas, atribut a:parent-id disisipkan pada parent elemen di http://www.contoso.com/parent-id namespace. Metode CreateAttribute ini digunakan untuk menyisipkan atribut saat diposisikan pada parent elemen .
http://www.contoso.com Deklarasi namespace secara otomatis dimasukkan oleh XPathNavigator kelas untuk mempertahankan konsistensi dokumen XML lainnya.
Memodifikasi Node Referensi Entitas
Simpul referensi entitas dalam objek XmlDocument bersifat hanya-baca dan tidak dapat diedit menggunakan kelas XPathNavigator atau kelas XmlNode. Setiap upaya untuk mengubah simpul referensi entitas menghasilkan InvalidOperationException.
Memodifikasi Node xsi:nil
Rekomendasi Skema XML W3C memperkenalkan konsep elemen yang dapat bernilai null. Ketika elemen dapat disingkirkan, elemen mungkin tidak memiliki konten dan masih valid. Konsep bahwa suatu elemen dapat bernilai kosong mirip dengan konsep bahwa suatu objek dapat menjadi null. Perbedaan utamanya adalah bahwa null objek tidak dapat diakses dengan cara apa pun, sementara xsi:nil elemen masih memiliki properti seperti atribut yang dapat diakses, tetapi tidak memiliki konten (elemen turunan atau teks). Keberadaan xsi:nil atribut dengan nilai true pada elemen dalam dokumen XML digunakan untuk menunjukkan bahwa elemen tidak memiliki konten.
Jika objek XPathNavigator digunakan untuk menambahkan konten ke elemen yang valid dengan atribut xsi:nil yang bernilai true, maka nilai dari atribut tersebut xsi:nil diatur ke false.
Nota
Jika konten elemen dengan atribut yang xsi:nil diatur ke false dihapus, nilai atribut tidak diubah menjadi true.
Menyimpan Dokumen XML
Perubahan pada objek XmlDocument sebagai hasil dari metode pengeditan yang dijelaskan dalam topik ini disimpan menggunakan metode dari kelas XmlDocument. Untuk informasi selengkapnya tentang menyimpan perubahan yang XmlDocument dilakukan pada objek, lihat Menyimpan dan Menulis Dokumen.