LINQ to XML a DOM

W tym artykule opisano niektóre podstawowe różnice między LINQ to XML i obecnie dominującym interfejsem API programowania XML, W3C Document Object Model (DOM).

Nowe sposoby konstruowania drzew XML

W modelu W3C DOM tworzysz drzewo XML od dołu. oznacza to, że tworzysz dokument, tworzysz elementy, a następnie dodajesz elementy do dokumentu.

Na przykład w poniższym przykładzie użyto typowego sposobu tworzenia drzewa XML przy użyciu implementacji modelu DOM firmy XmlDocument Microsoft.

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
XmlElement phone1 = doc.CreateElement("Phone");
phone1.SetAttribute("Type", "Home");
phone1.InnerText = "206-555-0144";
XmlElement phone2 = doc.CreateElement("Phone");
phone2.SetAttribute("Type", "Work");
phone2.InnerText = "425-555-0145";
XmlElement street1 = doc.CreateElement("Street1");
street1.InnerText = "123 Main St";
XmlElement city = doc.CreateElement("City");
city.InnerText = "Mercer Island";
XmlElement state = doc.CreateElement("State");
state.InnerText = "WA";
XmlElement postal = doc.CreateElement("Postal");
postal.InnerText = "68042";
XmlElement address = doc.CreateElement("Address");
address.AppendChild(street1);
address.AppendChild(city);
address.AppendChild(state);
address.AppendChild(postal);
XmlElement contact = doc.CreateElement("Contact");
contact.AppendChild(name);
contact.AppendChild(phone1);
contact.AppendChild(phone2);
contact.AppendChild(address);
XmlElement contacts = doc.CreateElement("Contacts");
contacts.AppendChild(contact);
doc.AppendChild(contacts);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
Dim phone1 As XmlElement = doc.CreateElement("Phone")
phone1.SetAttribute("Type", "Home")
phone1.InnerText = "206-555-0144"
Dim phone2 As XmlElement = doc.CreateElement("Phone")
phone2.SetAttribute("Type", "Work")
phone2.InnerText = "425-555-0145"
Dim street1 As XmlElement = doc.CreateElement("Street1")
street1.InnerText = "123 Main St"
Dim city As XmlElement = doc.CreateElement("City")
city.InnerText = "Mercer Island"
Dim state As XmlElement = doc.CreateElement("State")
state.InnerText = "WA"
Dim postal As XmlElement = doc.CreateElement("Postal")
postal.InnerText = "68042"
Dim address As XmlElement = doc.CreateElement("Address")
address.AppendChild(street1)
address.AppendChild(city)
address.AppendChild(state)
address.AppendChild(postal)
Dim contact As XmlElement = doc.CreateElement("Contact")
contact.AppendChild(name)
contact.AppendChild(phone1)
contact.AppendChild(phone2)
contact.AppendChild(address)
Dim contacts As XmlElement = doc.CreateElement("Contacts")
contacts.AppendChild(contact)
doc.AppendChild(contacts)
Console.WriteLine(doc.OuterXml)

Ten styl kodowania ukrywa strukturę drzewa XML. LINQ to XML obsługuje również alternatywne podejście, konstrukcję funkcjonalną, która lepiej pokazuje strukturę. Takie podejście można wykonać przy użyciu XElement XAttribute konstruktorów i . W Visual Basic można to również zrobić za pomocą literałów XML. W tym przykładzie pokazano konstrukcję tego samego drzewa XML przy użyciu konstrukcji funkcjonalnej:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144",
                new XAttribute("Type", "Home")),
            new XElement("phone", "425-555-0145",
                new XAttribute("Type", "Work")),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Dim contacts = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone Type="Home">206-555-0144</Phone>
            <Phone Type="Work">425-555-0145</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

Zwróć uwagę, że wcięcie kodu służącego do konstruowania drzewa XML pokazuje strukturę bazowego kodu XML. Wersja Visual Basic używa literałów XML.

Aby uzyskać więcej informacji, zobacz Drzewa XML.

Praca bezpośrednio z elementami XML

Programowanie przy użyciu kodu XML koncentruje się zwykle na elementach XML, a być może na atrybutach. W LINQ to XML można pracować bezpośrednio z elementami i atrybutami XML. Na przykład można wykonać następujące czynności:

  • Tworzenie elementów XML bez używania obiektu dokumentu w ogóle. Upraszcza to programowanie, gdy trzeba pracować z fragmentami drzew XML.
  • Ładowanie T:System.Xml.Linq.XElement obiektów bezpośrednio z pliku XML.
  • Serializuj T:System.Xml.Linq.XElement obiekty do pliku lub strumienia.

Porównaj to z W3C DOM, w którym dokument XML jest używany jako kontener logiczny dla drzewa XML. W modelu DOM węzły XML, w tym elementy i atrybuty, muszą być tworzone w kontekście dokumentu XML. Poniżej znajduje się fragment kodu, który umożliwia utworzenie elementu name w modelu DOM:

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
doc.AppendChild(name);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
doc.AppendChild(name)

Jeśli chcesz użyć elementu w wielu dokumentach, musisz zaimportować węzły między dokumentami. LINQ to XML pozwala uniknąć tej warstwy złożoności.

W przypadku LINQ to XML należy użyć klasy tylko wtedy, gdy chcesz dodać komentarz lub instrukcję przetwarzania na poziomie głównym XDocument dokumentu.

Uproszczona obsługa nazw i przestrzeni nazw

Obsługa nazw, przestrzeni nazw i prefiksów przestrzeni nazw jest zazwyczaj złożoną częścią programowania XML. LINQ to XML upraszcza nazwy i przestrzenie nazw, eliminując konieczność radzenia sobie z prefiksami przestrzeni nazw. Jeśli chcesz kontrolować prefiksy przestrzeni nazw, możesz to zrobić. Jeśli jednak zdecydujesz się nie jawnie kontrolować prefiksów przestrzeni nazw, program LINQ to XML przypisze prefiksy przestrzeni nazw podczas serializacji, jeśli są one wymagane, lub serializuje je przy użyciu domyślnych przestrzeni nazw, jeśli nie są. Jeśli są używane domyślne przestrzenie nazw, w wynikowym dokumencie nie będzie żadnych prefiksów przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Namespaces overview (Omówienie przestrzeni nazw).

Innym problemem z modelem DOM jest to, że nie umożliwia on zmiany nazwy węzła. Zamiast tego należy utworzyć nowy węzeł i skopiować do niego wszystkie węzły podrzędne, co utraci oryginalną tożsamość węzła. LINQ to XML uniknąć tego problemu, umożliwiając ustawienie XName właściwości w węźle.

Statyczna obsługa metody ładowania kodu XML

LINQ to XML umożliwia ładowanie kodu XML przy użyciu metod statycznych, a nie metod wystąpienia. Upraszcza to ładowanie i analizowanie. Aby uzyskać więcej informacji, zobacz How to load XML from a file (Jak załadować kod XML z pliku).

Usunięcie obsługi konstrukcji DTD

LINQ to XML jeszcze bardziej upraszcza programowanie XML przez usunięcie obsługi odwołań do jednostek i jednostek. Zarządzanie jednostkami jest złożone i rzadko używane. Usunięcie ich obsługi zwiększa wydajność i upraszcza interfejs programowania. Gdy drzewo LINQ to XML jest wypełnione, wszystkie jednostki DTD są rozwinięte.

Obsługa fragmentów

LINQ to XML nie zapewnia odpowiednika dla XmlDocumentFragment klasy. Jednak w wielu przypadkach koncepcja może być obsłużona przez wynik zapytania, które jest typowane XmlDocumentFragment jako IEnumerable<T> , lub XNode IEnumerable<T> XElement .

Obsługa nawigacji XPathNavigator

LINQ to XML obsługuje metody rozszerzeń w XPathNavigator przestrzeni System.Xml.XPath nazw . Aby uzyskać więcej informacji, zobacz System.Xml.XPath.Extensions.

Obsługa białych spacji i wcięcia

LINQ to XML obsługuje białe miejsce bardziej niż dom.

Powszechnym scenariuszem jest odczytywanie kodu XML z wcięciami, tworzenie drzewa XML w pamięci bez żadnych białych węzłów tekstowych (czyli bez zachowywania białych spacji), niektóre operacje w pliku XML, a następnie zapisywanie kodu XML z wcięciem. Podczas serializacji XML z formatowaniem tylko znaczne białe miejsce w drzewie XML jest zachowywany. Jest to domyślne zachowanie dla LINQ to XML.

Innym powszechnym scenariuszem jest odczytywanie i modyfikowanie kodu XML, który został już celowo wcięty. Wcięcie może nie być w żaden sposób zmieniane. W LINQ to XML możesz to zrobić, korzystając z:

  • Zachowywanie białych spacji podczas ładowania lub analizowania kodu XML.
  • Wyłączanie formatowania podczas serializacji XML.

LINQ to XML przechowuje białe miejsce jako węzeł, zamiast mieć wyspecjalizowany typ węzła, tak XText jak robi to model Whitespace DOM.

Obsługa adnotacji

LINQ to XML elementy obsługują rozszerzalny zestaw adnotacji. Jest to przydatne do śledzenia różnych informacji o elemencie, takich jak informacje o schemacie, informacje o tym, czy element jest powiązany z interfejsem użytkownika lub dowolnego innego rodzaju informacji specyficznych dla aplikacji. Aby uzyskać więcej informacji, zobacz LINQ to XML adnotacje.

Obsługa informacji o schemacie

LINQ to XML zapewnia obsługę weryfikacji XSD za pośrednictwem metod rozszerzeń w przestrzeni System.Xml.Schema nazw . Można sprawdzić, czy drzewo XML jest zgodne z XSD. Drzewo XML można wypełnić zestawem informacji po weryfikacji schematu (PSVI, post-schema-validation infoset). Aby uzyskać więcej informacji, zobacz Jak zweryfikować przy użyciu XSD i Extensions .

Zobacz też