【问题标题】:Parsing XML file in C# (with using xmlschemas?)在 C# 中解析 XML 文件(使用 xmlschema?)
【发布时间】:2016-01-12 12:23:48
【问题描述】:

如何解析这个 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("--------------");
                }

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

【问题讨论】:

  • 你得到什么错误?或者你还遇到了什么问题?
  • 您可以尝试使用XMLReaderLINQ to XML,您想让我详细说明一下吗?
  • doc.SelectNodes 使用 XPath 来选择节点,如果您不提供路径,则假定您需要根级节点,但您的 CatalogObject 节点是 Data 节点的子节点。您可能想阅读有关 XPath 的教程,例如csharp.net-tutorials.com/xml/…

标签: c# xml parsing


【解决方案1】:
doc.SelectNodes("CatalogObject")

不匹配,原因有两个:

  1. XML 示例中的元素名称是“CatalogObject.Obj”,而不是 “目录对象”。
  2. 元素已命名空间(“v8”)。

所以正确的表达方式是:

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

【讨论】:

  • 顺便说一句,要 100% 准确,您还必须检查正确的命名空间://*[local-name()='CatalogObject.Obj'][namespace-uri()='http://v8.1c.ru/8.1/data/enterprise/current-config']
【解决方案2】:

试试 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 2013-05-29
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多