Aracılığıyla paylaş


XPathNavigator kullanarak XML verilerini değiştirme

sınıfı, XPathNavigator XML belgesindeki düğümleri ve değerleri değiştirmek için kullanılan bir yöntem kümesi sağlar. Bu yöntemleri kullanabilmek için nesnenin XPathNavigator düzenlenebilir olması, yani özelliğinin CanEdit olması truegerekir.

XPathNavigator sınıfının CreateNavigator yöntemi tarafından oluşturulan XmlDocument XML belgesini düzenleyebilen nesnelerdir. XPathNavigator sınıfı tarafından XPathDocument oluşturulan nesneler salt okunurdur ve XPathNavigator nesnesi tarafından oluşturulan bir XPathDocument nesnenin düzenleme yöntemlerini kullanmaya yönelik tüm girişimler bir NotSupportedException ile sonuçlanır.

Düzenlenebilir XPathNavigator nesneler oluşturma hakkında daha fazla bilgi için bkz. XPathDocument ve XmlDocument kullanarak XML Verilerini Okuma.

Düğümleri Değiştirme

Bir düğümün değerini değiştirmek için basit bir teknik, SetValue sınıfının SetTypedValue ve XPathNavigator yöntemlerini kullanmaktır.

Aşağıdaki tabloda bu yöntemlerin farklı düğüm türleri üzerindeki etkileri listelenmiştir.

XPathNodeType Veriler Değiştirildi
Root Desteklenmiyor.
Element öğesinin içeriği.
Attribute özniteliğinin değeri.
Text Metin içeriği.
ProcessingInstruction hedef hariç içerik.
Comment Açıklamanın içeriği.
Namespace Desteklenmiyor.

Uyarı

Namespace düğümlerini veya Root düğümünü düzenleme özelliği desteklenmemektedir.

sınıfı XPathNavigator ayrıca düğüm eklemek ve kaldırmak için kullanılan bir dizi yöntem sağlar. XML belgesine düğüm ekleme ve kaldırma hakkında daha fazla bilgi için XPathNavigator kullanarak XML Verileri Ekleme ve XPathNavigator kullanarakXML Verilerini Kaldırma konularına bakın.

Yazılmamış Değerleri Değiştirme

SetValue yöntemi, parametre olarak geçirilen yazılmamış string değerini, XPathNavigator nesnesinin şu anda konumlandırıldığı düğümün değeri olarak ekler. Değer, herhangi bir tür olmadan veya şema bilgileri varsa yeni değerin düğümün türüne göre geçerli olduğunu doğrulamadan eklenir.

Aşağıdaki örnekte, SetValue yöntemi, price dosyasındaki tüm contosoBooks.xml öğelerini güncellemek için kullanılır.

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)

Örnek, contosoBooks.xml dosyasını giriş olarak alır.

<?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>

Yazılan Değerleri Değiştirme

Bir düğümün türü bir W3C XML Şeması basit türü olduğunda, SetTypedValue yöntemi tarafından eklenen yeni değer, değer ayarlanmadan önce basit türün kısıtlamalarına göre kontrol edilir. Yeni değer düğümün türüne göre geçerli değilse (örneğin, türü -1olan bir öğede değerini xs:positiveInteger ayarlama), bir özel durumla sonuçlanır.

Aşağıdaki örnek, price dosyasındaki ilk book öğesinin contosoBooks.xml değerini bir DateTime değeri olarak değiştirmeyi dener. price öğesinin XML Şema türü, xs:decimal dosyalarında contosoBooks.xsd olarak tanımlandığından, bu bir özel durumla sonuçlanır.

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);

Örnek, contosoBooks.xml dosyasını giriş olarak alır.

<?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>

Örnek, contosoBooks.xsd öğesini de giriş olarak alır.

<?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>

Kesin Olarak Yazılan XML Verilerini Düzenlemenin Etkileri

XPathNavigator sınıfı, kesin olarak yazılmış XML'yi tanımlamak için temel olarak W3C XML Şemasını kullanır. Öğeler ve öznitelikler, bir W3C XML Şeması belgesine karşı doğrulama temelinde tür bilgileriyle açıklanabilir. Diğer öğeleri veya öznitelikleri içerebilen öğeler karmaşık türler olarak adlandırılırken, yalnızca metin içeriği içerebilen öğelere basit türler denir.

Uyarı

Özniteliklerin yalnızca basit türleri olabilir.

Öğe veya öznitelik, tür tanımına özgü tüm kurallara uygunsa şema geçerli kabul edilebilir. Basit türe xs:int sahip bir öğenin şema geçerli olması için -2147483648 ile 2147483647 arasında sayısal bir değer içermesi gerekir. Karmaşık türler için öğenin şema geçerliliği, alt öğelerinin ve özniteliklerinin şema geçerliliğine bağlıdır. Bu nedenle, bir öğe karmaşık tür tanımında geçerliyse, tüm alt öğeleri ve öznitelikleri kendi tür tanımlarında geçerlidir. Benzer şekilde, bir öğenin alt öğelerinden veya özniteliklerinden biri bile türü tanımına göre geçersizse veya bilinmeyen bir geçerliliğe sahipse, öğe de geçersiz veya bilinmeyen geçerliliğe sahip olur.

Bir öğenin geçerliliğinin, alt öğelerinin ve özniteliklerinin geçerliliğine bağlı olduğu göz önünde bulundurulduğunda, öğesinde yapılan değişiklikler, öğenin daha önce geçerliyse geçerliliğinin değiştirilmesine neden olur. Özellikle, bir öğenin alt öğeleri veya öznitelikleri eklenir, güncelleştirilir veya silinirse, öğenin geçerliliği bilinmez hale gelir. Bu, öğenin Validity özelliğinin SchemaInfo özelliği NotKnown olarak ayarlandığında temsil edilir. Ayrıca, öğenin üst öğesinin (ve onun üst öğesinin vb.) geçerliliği de bilinmediğinden, bu etki XML belgesinde yinelemeli olarak yukarı doğru basamaklanır.

Şema doğrulaması ve XPathNavigator sınıfı hakkında daha fazla bilgi için bkz. XPathNavigator kullanarak Şema Doğrulama.

Öznitelikleri Değiştirme

SetValue ve SetTypedValue yöntemleri, yazılmamış ve yazılan öznitelik düğümlerinin yanı sıra "Düğümleri Değiştirme" bölümünde listelenen diğer düğüm türlerini değiştirmek için kullanılabilir.

Aşağıdaki örnek, dosyadaki genre ilk book öğenin books.xml özniteliğinin değerini değiştirir.

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);

SetValue ve SetTypedValue yöntemleri hakkında daha fazla bilgi için "Tiplenmemiş Değerleri Değiştirme" ve "Tiplenmiş Değerleri Değiştirme" bölümlerine bakın.

InnerXml ve OuterXml Özellikleri

InnerXml sınıfının ve OuterXml özellikleri, bir XPathNavigator nesnenin XPathNavigator şu anda konumlandırılmış olduğu düğümlerin XML işaretlemesini değiştirir.

InnerXml özelliği, XPathNavigator nesnesinin şu anda üzerinde konumlandırıldığı alt düğümlerin XML işaretlemesini, verilen XML'nin ayrıştırılmış string içeriğiyle değiştirir. Benzer şekilde, OuterXml özelliği hem XPathNavigator nesnesinin şu anda bulunduğu alt düğümlerin XML işaretlemesini hem de geçerli düğümün kendisini değiştirir.

Aşağıdaki örnek, OuterXml dosyasındaki ilk price öğesi üzerinde discount özelliğini kullanarak book öğesinin değerini değiştirmek ve yeni bir contosoBooks.xml özniteliği eklemek için kullanılır.

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);

Örnek, contosoBooks.xml dosyasını giriş olarak alır.

<?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>

Namespace Düğümlerini Değiştirme

Belge Nesne Modeli'nde (DOM), ad alanı bildirimleri eklenebilen, güncelleştirilebilen ve silinebilen normal öznitelikler gibi kabul edilir. Bir XPathNavigator ad alanı düğümünün değerini değiştirmek, aşağıdaki örnekte gösterildiği gibi ad alanı düğümü kapsamındaki öğelerin ve özniteliklerin kimliğini değiştirebileceğinden, sınıfı ad alanı düğümlerinde bu tür işlemlere izin vermez.

<root xmlns="http://www.contoso.com">
    <child />
</root>

Yukarıdaki XML örneği aşağıdaki şekilde değiştirilirse, her öğenin ad alanı URI'sinin değeri değiştirildiğinden, bu işlem belgedeki her öğeyi etkili bir şekilde yeniden adlandırır.

<root xmlns="urn:contoso.com">
    <child />
</root>

Eklendikleri kapsamda ad alanı bildirimleriyle çakışmayan ad alanı düğümlerinin eklenmesine XPathNavigator sınıfı tarafından izin verilir. Bu durumda, ad alanı bildirimleri XML belgesinde daha düşük kapsamlarda bildirilmez ve aşağıdaki örnekte gösterildiği gibi yeniden adlandırılmayla sonuçlanmaz.

<root xmlns:a="http://www.contoso.com">
    <parent>
        <a:child />
    </parent>
</root>

Yukarıdaki XML örneği aşağıdaki şekilde değiştirilirse, ad alanı bildirimleri diğer ad alanı bildiriminin kapsamının altındaki XML belgesine doğru şekilde yayılır.

<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>

Yukarıdaki XML örneğinde, a:parent-id özniteliği parent ad alanındaki http://www.contoso.com/parent-id öğesine eklenir. Özniteliği eklemek için CreateAttribute yöntemi, parent öğesi üzerinde konumlandırıldığı sırada kullanılır. http://www.contoso.com Ad alanı bildirimi, XML belgesinin geri kalanının XPathNavigator tutarlılığını korumak için sınıfı tarafından otomatik olarak eklenir.

Öğe Başvuru Düğümlerini Değiştirme

Bir XmlDocument nesnesindeki varlık başvuru düğümleri salt okunurdur ve ne XPathNavigator ne de XmlNode sınıfları kullanılarak düzenlenebilir. Varlık referans düğümünü değiştirme girişimleri sonucunda bir InvalidOperationException olur.

xsi:nil Düğümlerini Değiştirme

W3C XML Şeması önerisi, nillable olan bir öğe kavramını tanıtır. Bir öğe nillable olduğunda, öğenin içeriği olmaması ve hala geçerli olması mümkündür. Nillable olan bir öğe kavramı, bir nesnenin null olma kavramına benzer. Temel fark, bir null nesneye hiçbir şekilde erişilememesidir, oysa bir xsi:nil öğesi, erişilebilen öznitelikler gibi özelliklere sahiptir ancak içeriği (alt öğeler veya metin) yoktur. XML belgesindeki xsi:nil bir öğede değeri true olan özniteliğin varlığı, bir öğenin içeriği olmadığını göstermek için kullanılır.

Bir XPathNavigator nesne, değerine xsi:nilsahip bir özniteliği olan geçerli bir true öğeye içerik eklemek için kullanılırsa, özniteliğinin xsi:nil değeri olarak falseayarlanır.

Uyarı

Özniteliği ayarlanmış xsi:nil bir false öğenin içeriği silinirse, özniteliğin değeri olarak truedeğiştirilmez.

XML Belgesini Kaydetme

Bu konuda açıklanan düzenleme yöntemlerinin sonucu olarak bir XmlDocument nesnede yapılan değişiklikleri kaydetmek, sınıfının yöntemleri XmlDocument kullanılarak gerçekleştirilir. Nesnede XmlDocument yapılan değişiklikleri kaydetme hakkında daha fazla bilgi için bkz. Belge Kaydetme ve Yazma.

Ayrıca bakınız