【问题标题】:how to read XML file with C#如何使用 C# 读取 XML 文件
【发布时间】:2019-04-06 08:03:28
【问题描述】:

我想用 C#(统一项目)读取 XML 文件以显示一些内容。 XML 文件由 Talend Studio 中的 TALEND 作业提供。

我已经将一个 XML 文件转换为 C# 类,现在我正在尝试读取这个 XML(存储在一个文件中)来管理内容。

目前,我可以读取一些属性,但最有趣的标签是 nul。反序列化过程中没有错误。

private const string filename = "/Applications/TalendStudio-7.1.1/studio/workspace/LOCAL_PROJECT/process/job1_0.1.item";
void Start()
{  
    // Create an instance of the XmlSerializer.
    XmlSerializer serializer = new XmlSerializer(typeof(Xml2CSharp.ProcessType));

    // Declare an object variable of the type to be deserialized.
    Xml2CSharp.ProcessType i;

    using (Stream reader = new FileStream(filename, FileMode.Open))
    {
        // Call the Deserialize method to restore the object's state.
        i = (Xml2CSharp.ProcessType)serializer.Deserialize(reader); 
        Debug.Log(i);         
    }
}

XML 文件以 :

开头
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<talendfile:ProcessType 
xmlns:talendfile="TalendFile.xsd" xmlns:TalendMapper="http://www.talend.org/mapper" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
defaultContext="Default" jobType="Standard" xmi:version="2.0">
    <context confirmationNeeded="false" name="Default">
      <contextParameter comment="" name="max_rows" prompt="max_rows?" promptNeeded="false" type="id_Integer" value="10"/>
    </context>
    <context confirmationNeeded="false" name="prod">
      <contextParameter comment="" name="max_rows" prompt="max_rows?" promptNeeded="false" type="id_Integer" value="30"/>
    </context>
    <context confirmationNeeded="false" name="qa">
      <contextParameter comment="" name="max_rows" prompt="max_rows?" promptNeeded="false" type="id_Integer" value="20"/>
    </context>
<parameters>
   <elementParameter field="TEXT" name="SCREEN_OFFSET_X" show="false" value="0"/>
   <elementParameter field="TEXT" name="SCREEN_OFFSET_Y" show="false" value="0"/>
   <elementParameter field="TEXT" name="REPOSITORY_CONNECTION_ID" show="false" value=""/>

等等……

“上下文”和“参数”为空。感谢您的帮助。

【问题讨论】:

  • 好的,现在好多了。 XML 开始反序列化。我在一个节点上仍然遇到一个错误: 因为 xsi:type。看起来 Deserializer 需要一个特殊的设置来识别 MapperData 类型。有什么帮助吗?谢谢。
  • 将 Xml2CSharp.ProcessType 类与我的解决方案中的类进行比较。它们应该是相同的。

标签: c# xml serialization


【解决方案1】:

使用xml序列化:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(ProcessType));

            ProcessType processType = (ProcessType)serializer.Deserialize(reader);


        }
    }
    [XmlRoot(ElementName = "ProcessType", Namespace = "TalendFile.xsd")] 
    public class ProcessType
    {
        [XmlAttribute("defaultContext")]
        public string defaultContext { get; set; }

        [XmlAttribute("jobType")]
        public string jobType { get; set; }

        [XmlElement("context", Namespace = "")]
        public List<Context> context { get; set; }

        [XmlArray("parameters", Namespace = "")]
        [XmlArrayItem("elementParameter", Namespace = "")]
        public List<Parameters> parameters { get; set; } 

   }
   [XmlRoot("context", Namespace = "")]
   public class Context
   {
       [XmlAttribute("confirmationNeeded")]
       public string confirmationNeeded { get; set; }

       [XmlAttribute("name")]
       public string name { get; set; }

       [XmlElement("contextParameter", Namespace = "")]
       public ContextParameter contextParameter { get; set; }
   }
   [XmlRoot("contextParameter", Namespace = "")]
   public class ContextParameter
   {
       [XmlAttribute("comment")]
       public string comment { get; set; }

       [XmlAttribute("name")]
       public string name { get; set; }

       [XmlAttribute("prompt")]
       public string prompt { get; set; }

       [XmlAttribute("promptNeeded")]
       public string promptNeeded { get; set; }

       [XmlAttribute("type")]
       public string type { get; set; }

       [XmlAttribute("value")]
       public int value { get; set; }
   }
    [XmlRoot("parameters", Namespace = "")]
   public class Parameters
   {
       [XmlAttribute("field")]
       public string field { get; set; }

       [XmlAttribute("name")]
       public string name { get; set; }

       [XmlAttribute("show", Namespace = "")]
       public string show { get; set; }

       private int? _value { get; set; }
       [XmlAttribute("value")]
       public string value {
           get { return _value.ToString(); }
           set { _value = value == string.Empty ? (int?)null : int.Parse(value); }
       }
   }
}

【讨论】:

  • 你好。我没有构建 xml 文件。我想通过反序列化来阅读它。我现在知道出了什么问题。元素 nodeData 是多态的。我需要在 C# 类 nodeData 中找到一种方法来管理它。
  • 代码正在使用标准的网络库反序列化读取 xml 文件。您的问题与命名空间有关。我不熟悉 Xml2CSharp 类,不知道如何使用该类解决问题。
  • 您好,Xml2Csharp 已用于将 XML 转换为 C# 类。它只是一个名称空间。不是一门课。
  • Xml2Csharp 类不工作。他们可能没有正确处理命名空间。我的课有效。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多