Чтение XML в C # - PullRequest
       1

Чтение XML в C #

0 голосов
/ 20 декабря 2010

У меня есть следующий xml

<Objects>
    <Object>
        <ViewAngle>90</ViewAngle>
        <ViewMode>ThirdPerson</ViewMode>
        <Top>50</Top>
        <Left>100</Left>
    </Object>
</Objects>

У меня есть следующий код, чтобы прочитать этот xml

           XmlDataDocument doc = new XmlDataDocument();
           doc.Load(xmlPath);
           XmlElement root = doc.DocumentElement;
           XmlNodeList nodes = root.SelectNodes("/Objects/Object");
           foreach (XmlNode node in nodes)
           {
                if (node.InnerXml.Contains("View"))
                {
                  string viewType=node["View"].InnerText;
                  //..... other stuffs
                }
                if (node.InnerXml.Contains("ViewAngle"))
                {
                  string viewAngle=node["ViewAngle"].InnerText;
                  //..... other stuffs
                }
                if (node.InnerXml.Contains("ViewMode"))
                {
                  string viewMode=node["ViewMode"].InnerText;
                  //..... other stuffs
                }
           }

Над кодом работает нормально, если мой xml содержит еще один тег, т.е. <View>3dView</View>.Но если он не содержит тега View, он выдает ошибку.

InnerXml.Contains() - это простой строковый метод, который проверяет наличие в строке подстроки или нет.

В моем случае Contains("View") возвращает true как Просмотр присутствует в ViewAngle и в ViewMode , поэтому он находится внутри блока if View , но при попытке прочитать node["View"], выдает ошибку, поскольку Просмотр узел не существует в XML.

Как устранить эту ошибку?

Ответы [ 5 ]

3 голосов
/ 20 декабря 2010

Вам не хватает того факта, что XML - это структурированные данные, а не строка.Это полностью неправильный подход:

if (node.InnerXml.Contains("View")) {
  // ...
}

Вы хотите это:

XmlNode child = node.SelectSingleNode("./View");
if (child != null) {
  // now do something with 'child' ...
}
1 голос
/ 20 декабря 2010

Попробуйте этот цикл вместо:

        foreach (XmlNode node in nodes) {
            foreach (XmlNode prop in node.ChildNodes) {
                if (prop.NodeType != XmlNodeType.Element)
                    continue;

                switch (prop.Name) {
                    case "View":
                        string viewType = prop.InnerText;
                        // ...
                        break;

                    case "ViewAngle":
                        string viewAngle = prop.InnerText;
                        // ...
                        break;

                    case "ViewMode":
                        string viewMode = prop.InnerText;
                        // ...
                        break;
                }
            }
        }
0 голосов
/ 20 декабря 2010

если trageting 3.5 или выше, вы можете использовать linq

XDocument XDoc = XDocument.Load(@"C:\UrXMLFile.xml");


var q = from b in xml.Descendants("product")
        select new
        {
            View      = (string)b.Element("View") ?? "3dView",
            ViewAngle = (double?)b.Element("ViewAngle") ?? 90.0,                    
            ViewMode  = (string)b.Element("ViewMode") ?? ThirdPerson,
            Top       = (double?)b.Element("Top") ?? 0.0,
            Left      = (double?)b.Element("Left") ?? 0.0
        };

Так что, если View не найден, у него всегда будет значение по умолчанию.Также вы можете создать свой класс объекта в выберите новый.Примечание: я не скомпилировал его.

0 голосов
/ 20 декабря 2010

Вы можете внести некоторые изменения в эту функцию и использовать ее соответственно

 XDocument xDoc=XDocument.Load(@"C:\File.xml");            
Process(xDoc.Root);


public static void Process(XElement element)
        {
            if (element.HasElements)
            {
                Console.WriteLine("<" + element.Name.LocalName + ">");
                foreach (XElement child in element.Elements())
                {
                    Process(child);
                }
                Console.WriteLine("<" + element.Name.LocalName + ">");
            }
            else
            {
                Console.WriteLine("<" + element.Name.LocalName);
                if(element.HasAttributes)
                {
                    foreach (XAttribute attr in element.Attributes())
                    {
                        Console.WriteLine(attr.Name +"="+attr.Value);
                    }
                }
                Console.WriteLine(">" + element.Value + "</" + element.Name.LocalName + ">");  
            }
        }
0 голосов
/ 20 декабря 2010

Если элемент View отсутствует, его невозможно найти.Вместо этого вы можете использовать метод GetElementsByTagName ("View").Это вернет ноль, если элемент view отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...