LINQ to XML a DOM

W tym artykule opisano niektóre kluczowe różnice między LINQ to XML i obecnym dominującym interfejsem API programowania XML, modelem obiektów dokumentów W3C (DOM).

Nowe sposoby konstruowania drzew XML

W modelu DOM W3C utworzysz drzewo XML od dołu w górę; 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 Microsoft. XmlDocument

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ć za pomocą XElement konstruktorów i XAttribute . W języku Visual Basic można go również wykonać 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 do konstruowania drzewa XML pokazuje strukturę bazowego kodu XML. Wersja języka Visual Basic używa literałów XML.

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

Praca bezpośrednio z elementami XML

Podczas programowania przy użyciu kodu XML główny nacisk jest zwykle na elementach XML i być może na atrybutach. W linQ to XML można pracować bezpośrednio z elementami i atrybutami XML. Można na przykład wykonać następujące czynności:

  • Utwórz elementy XML bez używania w ogóle obiektu dokumentu. Upraszcza to programowanie, gdy trzeba pracować z fragmentami drzew XML.
  • Załaduj T:System.Xml.Linq.XElement obiekty bezpośrednio z pliku XML.
  • Serializuj T:System.Xml.Linq.XElement obiekty do pliku lub strumienia.

Porównaj to z obiektem DOM W3C, w którym dokument XML jest używany jako kontener logiczny drzewa XML. W modelu DOM węzły XML, w tym elementy i atrybuty, muszą zostać utworzone w kontekście dokumentu XML. Oto fragment kodu do utworzenia 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 unika tej warstwy złożoności.

W przypadku używania linQ to XML należy użyć XDocument klasy tylko wtedy, gdy chcesz dodać instrukcję komentarza lub przetwarzania na poziomie głównym 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 wymaganie obsługi prefiksów przestrzeni nazw. Jeśli chcesz kontrolować prefiksy przestrzeni nazw, możesz. Jeśli jednak zdecydujesz się nie jawnie kontrolować prefiksów przestrzeni nazw, linQ to XML przypisze prefiksy przestrzeni nazw podczas serializacji, jeśli są wymagane, lub serializuje 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 Omówienie przestrzeni nazw.

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

Obsługa metody statycznej na potrzeby ładowania kodu XML

LINQ to XML umożliwia ładowanie kodu XML przy użyciu metod statycznych zamiast metod wystąpień. Upraszcza to ładowanie i analizowanie. Aby uzyskać więcej informacji, zobacz Jak załadować kod XML z pliku.

Usuwanie obsługi konstrukcji DTD

Język LINQ to XML dodatkowo upraszcza programowanie XML, usuwając obsługę jednostek i odwołań do jednostek. Zarządzanie jednostkami jest złożone i rzadko jest używane. Usunięcie ich obsługi zwiększa wydajność i upraszcza interfejs programowania. Po wypełnieniu drzewa LINQ to XML wszystkie jednostki DTD są rozwinięte.

Obsługa fragmentów

LINQ to XML nie zapewnia odpowiednika XmlDocumentFragment klasy. W wielu przypadkach jednak XmlDocumentFragment koncepcja może być obsługiwana przez wynik zapytania wpisanego XNodejako IEnumerable<T> , lub IEnumerable<T>XElement.

Obsługa klasy XPathNavigator

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

Obsługa białych znaków i wcięcia

LINQ to XML obsługuje odstępy bardziej niż DOM.

Typowym scenariuszem jest odczytywanie wciętego kodu XML, tworzenie drzewa XML w pamięci bez żadnych węzłów tekstowych białych znaków (czyli brak zachowania odstępu), wykonywanie niektórych operacji na kodzie XML, a następnie zapisywanie kodu XML przy użyciu wcięcia. Podczas serializacji kodu XML przy użyciu formatowania zachowywane jest tylko znaczne odstępy w drzewie XML. Jest to domyślne zachowanie linQ to XML.

Innym typowym scenariuszem jest odczytywanie i modyfikowanie kodu XML, który został już celowo wcięta. Możesz nie chcieć zmienić tego wcięcia w żaden sposób. W linQ to XML możesz to zrobić, wykonując następujące czynności:

  • Zachowywanie odstępu podczas ładowania lub analizowania kodu XML.
  • Wyłączenie formatowania podczas serializacji kodu XML.

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

Obsługa adnotacji

Elementy LINQ to XML obsługują rozszerzalny zestaw adnotacji. Jest to przydatne do śledzenia różnych informacji na temat elementu, takich jak informacje o schemacie, informacje o tym, czy element jest powiązany z interfejsem użytkownika, czy też jakiekolwiek inne informacje specyficzne dla aplikacji. Aby uzyskać więcej informacji, zobacz adnotacje LINQ to XML.

Obsługa informacji o schemacie

LINQ to XML zapewnia obsługę walidacji XSD za pomocą metod rozszerzeń w System.Xml.Schema przestrzeni nazw. Możesz sprawdzić, czy drzewo XML jest zgodne z XSD. Drzewo XML można wypełnić za pomocą zestawu informacji po weryfikacji schematu (PSVI). Aby uzyskać więcej informacji, zobacz How to validate using XSD and Extensions.

Zobacz też