Skrawki kodu do korzystania z XML’a

Zdeserializowanie części xml’a (dokładnie jednego node’a) do obiektu.


public Information Foo(string file)
        {
            XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(file);
            XmlNode node = doc.SelectSingleNode("/Data/Information");
            XmlNodeReader reader = new XmlNodeReader(node);

            XmlSerializer ser = new XmlSerializer(typeof(Information));
            return (Information)ser.Deserialize(reader);
        }

Tworzenie nowgo node’a nie posiadając XmlDocument – korzystamy z OwnerDocument


        private void AppendChildToXmlNode(System.Xml.XmlElement xmlElem, string name, string strValue)
        {
            System.Xml.XmlElement xmlChild = xmlElem.OwnerDocument.CreateElement(name);
            xmlChild.InnerText = strValue;
            xmlElem.AppendChild(xmlChild);
        }


Powyższa funkcja działa jednak dobrze dla stringów, ale nie dla innych typów (przykładem bool) danych które za pomocą metody ToString() przekazaliśmy do tej funkcji. Dla przykładu następujące wywołanie

            bool isReady = true;
            AppendChildToXmlNode(xmlElem, "IsReady", isReady.ToString());

utworzy nam następująco wyglądającego node’a.

<node>
  <IsReady>True</IsReady>
</node>

Problemem jest tutaj rozpoczynające się z wielkiej litery „True” zamiast „true”. Standard xml definiuje wartości true/false/1/0. Aby więc móc później skorzystać z deserializacji takiego xml’a do obiektu korzystając z XmlSerializer nie możemy korzystać z metody ToString(). Skorzystanie z poniższego wywołania rozwiązuje sprawę.

            bool isReady = true;
            AppendChildToXmlNode(xmlElem, "IsReady", System.Xml.XmlConvert.ToString(isReady));

Gdyby ktoś już miał gotowy xml przygotowany w taki „zły” sposób, to przydatne okaże się Workaround to deserialize ‘True’, ‘False’ using XmlSerializer

Advertisements
Ten wpis został opublikowany w kategorii Uncategorized i oznaczony tagami , , . Dodaj zakładkę do bezpośredniego odnośnika.