无法解析XML对象和尝试过对象反序列化和LINQ的子级

问题描述 投票:0回答:1

到目前为止,我未能实现两种方法来解析xml树并将其及其子元素转换为对象。我已经尝试按照解释here进行对象序列化,并且按照接受的答案here的解释使用了Linq。

使用第一种方法(反序列化),它会一直工作到List<ExtensionItem>IndividualOrEntityValidationExtensions属性未分配其值(即,它保持为空)。

使用第二种方法(LINQ),我得到与整个OutputFilePaths =...块有关的错误。

/Users/g-wizkiz/Projects/XmlParser/XmlParser/Program.cs(68,68): Error CS0266: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<XmlParser.models.OutputFilePaths>' to 'XmlParser.models.OutputFilePaths'. An explicit conversion exists (are you missing a cast?) (CS0266) (XmlParser)

我很高兴选择任何可行的方法,尽管我确实觉得LINQ是一种更优雅的方法。

我将显示我的XML和类结构,然后显示相应的代码块。

XML

<?xml version="1.0" encoding="UTF-8" ?>
<ParameterList>
    <Parameters>
        <NumberOfThreads>10</NumberOfThreads>
        <InputFilePath>C:\Input.dat</InputFilePath>
         <OutputFilePaths>
            <NameFile>name.txt</NameFile>
            <ValidationFile>validation.txt</ValidationFile>
            <AuditLog>audit.txt</AuditLog>
        </OutputFilePaths>
        <DictionaryExtensions>
            <IndividualOrEntityValidationExtensions>
                <ExtensionItem>
                    <Type>dictType1</Type>
                    <Path>dictPath1</Path>
                </ExtensionItem>
                  <ExtensionItem>
                    <Type>dictType2</Type>
                    <Path>dictPat2</Path>
                </ExtensionItem>
            </IndividualOrEntityValidationExtensions>
        </DictionaryExtensions>
    </Parameters>
</ParameterList>

[XmlRoot("Parameters")]
    public class Parameters
    {
        public int NumberOfThreads { get; set; }
        public string InputFilePath { get; set; }
        public OutputFilePaths outputFilePaths { get; set; }
        public DictionaryExtensions DictionaryExtensions { get; set; }
    }

  public class OutputFilePaths
    {
        public string NameFile { get; set; }
        public string ValidationFile { get; set; }
        public string AuditLog { get; set; }
    }

        public class DictionaryExtensions
        {
        [XmlElement("IndividualOrEntityValidationExtensions")]
        public IndividualOrEntityValidationExtension IndividualOrEntityValidationExtensions { get; set; }
      }

       public class IndividualOrEntityValidationExtension
        {
            [XmlArrayItem("ExtensionItem")]
            public List<ExtensionItem> ExtensionItem { get; set; }
        }

    public class ExtensionItem
     {
        [XmlAttribute("Type")]
        public string Type { get; set; }
        [XmlAttribute("Path")]
        public string Path { get; set; }
    }

对象反序列化方法

string xmlString = System.IO.File.ReadAllText(@"/Users/g-wizkiz/Projects/XmlParser/XmlParser/parameters.xml");
            XmlSerializer serializer = new XmlSerializer(typeof(List<Parameters>), new XmlRootAttribute("ParameterList"));
            StringReader stringReader = new StringReader(xmlString);
            List<Parameters> parameters = (List<Parameters>)serializer.Deserialize(stringReader)

LINQ方法

XDocument doc = XDocument.Parse(xmlString);
            IEnumerable<Parameters> result = from c in doc.Descendants("Parameters")
                                             select new Parameters()
                                             {
                                                 NumberOfThreads = (int)c.Attribute("NumberOfThreads"),
                                                 InputFilePath = (string)c.Attribute("InputFilePath"),
                                                 outputFilePaths = from f in c.Descendants("OutputFilePaths")
                                                                   select new OutputFilePaths()
                                                                   {
                                                                       ValidationFile = (string)f.Attribute("ValidationFile"),
                                                                       AuditLog = (string)f.Attribute("AuditLog"),
                                                                       NameFile = (string)f.Attribute("NameFile")
                                                                   }
                                             };

干杯!

c# xml linq
1个回答
0
投票

该形状应该匹配

[XmlArray("IndividualOrEntityValidationExtensions")]
[XmlArrayItem("ExtensionItem")]
public IndividualOrEntityValidationExtension IndividualOrEntityValidationExtensions { get; set; }

您现在拥有的[XmlElement(...)]表示单嵌套,而不是双嵌套。

© www.soinside.com 2019 - 2024. All rights reserved.