在C#中解析XML文件(使用xmlschemas?)

时间:2016-01-12 12:23:48

标签: c# xml parsing

如何解析此XML文件?

<?xml version="1.0" encoding="UTF-8"?>
<V8Exch:_1CV8DtUD xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:core="http://v8.1c.ru/data" xmlns:v8="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <V8Exch:Data>
<v8:CatalogObject.Obj>
      <v8:IsFolder>false</v8:IsFolder>
          <v8:Ref xsi:type="v8:CatalogRef.Фізичніособи">433da912-9da5-11e5-822a-f079599615ce</v8:Ref>
<v8:DeletionMark>false</v8:DeletionMark>
      <v8:Parent xsi:type="v8:CatalogRef.Фізичніособи">4541cd82-9cfb-11e5-b79c-f079599615ce</v8:Parent>
      <v8:Code>000000007</v8:Code>
      <v8:Description>FullName</v8:Description>
      <v8:LastNmae>LastNmae</v8:LastNmae>
      <v8:FirstName>FirstName</v8:FirstName>
      <v8:SecondName>SecondName</v8:SecondName>
      <v8:Edu>
        <v8:НомерДиплома> 1234 </v8:НомерДиплома>
        <v8:НазваНавчельногоЗакладу>Iмені Івана Франка</v8:НазваНавчельногоЗакладу>
        <v8:датаВидачіДиплома>1981-06-27T00:00:00</v8:датаВидачіДиплома>
      </v8:Edu>
    </v8:CatalogObject.Obj>
  </V8Exch:Data>
  <PredefinedData/>
</V8Exch:_1CV8DtUD>

我正在尝试使用此C#

foreach (XmlNode node in doc.SelectNodes("CatalogObject"))
                {   XmlDocument doc = new XmlDocument();
                    doc.Load("C:\\1.xml");
                    foreach (XmlNode child in node.ChildNodes)
                        richTextBox1.AppendText(string.Format("{0} = {1}", child.Name, child.InnerText));
                    richTextBox1.AppendText("--------------");
                }

代码,但它不适用于此文件。它什么都不做。我必须用什么来解析这个文件? 谢谢!

2 个答案:

答案 0 :(得分:1)

doc.SelectNodes("CatalogObject")

不符合,原因有两个:

  1. XML示例中的元素名称是“CatalogObject.Obj”,而不是 “CatalogObject”。
  2. 该元素是命名空间(“v8”)。
  3. 所以正确的表达方式是:

    doc.SelectNodes("//*[local-name()='CatalogObject.Obj']")
    

答案 1 :(得分:0)

试试xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication65
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement _1CV8DtUD = (XElement)doc.FirstNode;
            XNamespace ns = _1CV8DtUD.Name.Namespace;
            XNamespace ns_V8 = _1CV8DtUD.GetNamespaceOfPrefix("v8");
            XNamespace ns_xsi = _1CV8DtUD.GetNamespaceOfPrefix("xsi");

            var results = _1CV8DtUD.Descendants(ns_V8 + "CatalogObject.Obj").Select(x => new {
                isFolder = (Boolean)x.Element(ns_V8 + "IsFolder"),
                type = (string)x.Element(ns_V8 + "Ref").Attribute(ns_xsi + "type")
            }).FirstOrDefault();
        }
    }
}