无法分析 XML 对象,并且尝试了对象反序列化和 LINQ 的子对象

  • 本文关键字:对象 反序列化 LINQ XML c# xml linq
  • 更新时间 :
  • 英文 :


到目前为止,我已经未能实现 2 种方法来解析 xml 树并将其及其子级强制转换为对象。我已经尝试了对象序列化,如此处的说明,并且我使用了Linq,如此处接受的答案所解释的那样。

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

使用第二种方法 (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)

林克方法

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")
}
};

干杯!

在本地测试,这是唯一的更改:

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

但是,如果您愿意,可以删除层次结构中的级别 - 完全丢弃IndividualOrEntityValidationExtension类型:

public class DictionaryExtensions
{
[XmlArray("IndividualOrEntityValidationExtensions")]
[XmlArrayItem("ExtensionItem")]
public List<ExtensionItem> ExtensionItems { get; set; }
}

我认为问题与Parameter类有关,其中OutputFilePaths是单个实体而不是IEnumerable<OutputFilePaths>,或者如果您只期望一个输出文件路径,请在linq查询中选择.FirstOrDefault()(为空值做好准备(。

我修复了你的 linq。 节点是元素而不是属性。

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

最新更新