有人遇到反序列化错误
Inner Exception 1:InvalidOperationException: <configuration xmlns=''> was not expected
System.InvalidOperationException occurred
HResult=0x80131509
Message=There is an error in XML document (2, 2).
StackTrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
在C#中打开和反序列化XML文件时?这是使用System.Xml.Serialization和以下代码时的情况:
var serializer = new XmlSerializer(typeof(ExtractorTask));
using (var reader = System.IO.File.OpenText(args[0]))
{
extractorTask = (ExtractorTask)serializer.Deserialize(reader);
}
可以使用System.Xml.Linq遍历相同的XML。
var doc = XDocument.Load(configFilePath);
这是XML文件的顶部:
<?xml version="1.0" encoding="utf-8"?>
<configuration LoaderConfig="disc42_loader_config_2014" Disc_Source="BigFix Inventory" >
<Custom Type="Pass-Through" Name="MU_HOST" Dynamic_subtype="Machine" Label="ILMT Server Details">
<Fields>
<Field Name="MachineID" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="1" FileColumnName="Key-MachineID:MachineID" />
</Fields>
</Custom>
我看过帖子...有人建议将名称空间添加到XML文件,但在使用System.Xml.Serialization;时仍然会遇到相同的错误。其他人建议以编程方式将根节点添加到XML树中。那也不起作用。我想避免不得不重写使用system.Xml.Serialization方法的代码。
感谢您的帮助!
跟进:
我在以下示例中添加了ROOT:
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "user";
// xRoot.Namespace = "http://www.cpandl.com";
xRoot.IsNullable = true;
XmlSerializer xs = new XmlSerializer(typeof(User),xRoot)
但这没用。
ExtractorTask类:
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml.Serialization;
namespace bdna.Extractor.DTO
public class ExtractorTask : ConfigObj
{
[XmlElement]
public ZipOutputRule ZipOutputRule { get; set; }
[XmlElement]
public SchemaRule SchemaRule { get; set; }
[XmlElement]
public DBAction DBAction { get; set; }
[XmlElement]
public FTPAction FTPAction { get; set; }
[XmlElement]
public XSFAction XSFAction { get; set; }
[XmlElement]
public RESTfulAPIAction RESTfulAPIAction { get; set; }
[XmlElement]
public ILMTRESTfulAPIAction ILMTRESTfulAPIAction { get; set; }
public TemplateAction TemplateAction { get; set; }
public ExtractorTask()
{
ZipOutputRule = new ZipOutputRule();
SchemaRule = new SchemaRule();
DBAction = new DBAction();
FTPAction = new FTPAction();
XSFAction = new XSFAction();
RESTfulAPIAction = new RESTfulAPIAction();
TemplateAction = new TemplateAction();
//cluster actions disabled by default
this.DeepDisable();
}
}
}
完整的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration LoaderConfig="disc42_loader_config_2014" Disc_Source="BigFix Inventory" >
<Custom Type="Pass-Through" Name="MU_HOST" Dynamic_subtype="Machine" Label="ILMT Server Details">
<Fields>
<Field Name="MachineID" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="1" FileColumnName="Key-MachineID:MachineID" />
<Field Name="DataSource" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="DataSourceName" />
<Field Name="ServerID" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="ServerID" />
<Field Name="PartitionCores" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="PartitionCores" />
<Field Name="ClusterName" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="ClusterName" />
<Field Name="ClusterID" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="ClusterID" />
<Field Name="ServerCores" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="ServerCores" />
<Field Name="PVUPerCore" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" Comment="" Key_Position="0" FileColumnName="PVUPerCore" />
</Fields>
</Custom>
<Custom Type="Pass-Through_A">
<Fields>
<Field Name="DiscoveryStart" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" />
<Field Name="DiscoveryEnd" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" />
<Field Name="ProductName" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" />
<Field Name="Charged" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" />
<Field Name="Excluded" DataType="NVARCHAR(255)" Nullable="1" DefaultValue="" />
</Fields>
</Custom>
<Authentication>
<Field Name="Basic" Source="/api/get_token" Key="token" TimeOut="1000000" Destination=""/>
</Authentication>
<Tables>
<Table>
<Name>System</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=host_name&columns[]=dns_name" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=host_name&columns[]=dns_name" Key="host_name" Destination="Name" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=host_name&columns[]=dns_name" Key="dns_name" Destination="Domain" />
</Table>
<Table>
<Name>Pass-Through_A</Name>
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/extended_software_facts?token={$}&columns[]=computer_id&columns[]=software_title_name&columns[]=is_charged&columns[]=is_excluded&columns[]=discoverable_guid&columns[]=component_id&columns[]=is_current&criteria={"and":[["is_current","=","1"]]}" Key="component_id" Destination="ProdID" />
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="catalog_dimension" Destination="DisplayName" />
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="catalog_dimension" Destination="Publisher" />
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="catalog_dimension" Destination="Version" />
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="valid_from" Destination="DiscoveryStart" />
<Field Source="/api/sam/software_instances?token={$}&columns[]=computer_id&columns[]=valid_from&columns[]=valid_to&columns[]=catalog_dimension.software_title_name&columns[]=catalog_dimension.publisher_name&columns[]=catalog_dimension.version&columns[]=discoverable_guid" Key="valid_to" Destination="DiscoveryEnd" />
<Field Source="/api/sam/extended_software_facts?token={$}&columns[]=computer_id&columns[]=software_title_name&columns[]=is_charged&columns[]=is_excluded&columns[]=discoverable_guid&columns[]=component_id&columns[]=is_current&criteria={"and":[["is_current","=","1"]]}" Key="software_title_name" Destination="ProductName" />
<Field Source="/api/sam/extended_software_facts?token={$}&columns[]=computer_id&columns[]=software_title_name&columns[]=is_charged&columns[]=is_excluded&columns[]=discoverable_guid&columns[]=component_id&columns[]=is_current&criteria={"and":[["is_current","=","1"]]}" Key="is_charged" Destination="Charged" />
<Field Source="/api/sam/extended_software_facts?token={$}&columns[]=computer_id&columns[]=software_title_name&columns[]=is_charged&columns[]=is_excluded&columns[]=discoverable_guid&columns[]=component_id&columns[]=is_current&criteria={"and":[["is_current","=","1"]]}" Key="is_excluded" Destination="Excluded" />
</Table>
<Table>
<Name>GS_OPERATING_SYSTEM</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=os" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=os" Key="os" Destination="Caption0" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=os" Key="os" Destination="Name0" />
</Table>
<Table>
<Name>GS_PROCESSOR</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=processor_vendor&columns[]=processor_brand_string" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=processor_vendor&columns[]=processor_brand_string" Key="processor_vendor" Destination="Manufacturer0" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=processor_vendor&columns[]=processor_brand_string" Key="processor_brand_string" Destination="Name0" />
</Table>
<Table>
<Name>GS_COMPUTER_SYSTEM</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_model&columns[]=server_processors" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_model&columns[]=server_processors" Key="hardware_manufacturer" Destination="Manufacturer0" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_model&columns[]=server_processors" Key="hardware_model" Destination="Model0" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_model&columns[]=server_processors" Key="server_processors" Destination="NumberofProcessors0" />
</Table>
<Table>
<Name>GS_WORKSTATION_STATUS</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=last_seen" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=last_seen" Key="last_seen" Destination="LastHWScan" />
</Table>
<Table>
<Name>GS_PC_BIOS</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_serial_number" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_serial_number" Key="hardware_manufacturer" Destination="Manufacturer0" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=hardware_manufacturer&columns[]=hardware_serial_number" Key="hardware_serial_number" Destination="SerialNumber0" />
</Table>
<Table>
<Name>Pass-Through</Name>
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="computer_id" Destination="Key-MachineID:MachineID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="datasource_name" Destination="DataSourceName" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="server_id" Destination="ServerID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="partition_cores" Destination="PartitionCores" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="cluster_id" Destination="ClusterID" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="server_cores" Destination="ServerCores" />
<Field Source="/api/sam/computer_systems?token={$}&columns[]=computer_id&columns[]=datasource_name&columns[]=server_id&columns[]=partition_cores&columns[]=cluster_id&columns[]=server_cores&columns[]=pvu_per_core" Key="pvu_per_core" Destination="PVUPerCore" />
</Table>
<Table>
<Name>AddRemove</Name>
<Field Source="/api/sam/packages.json?token={$}&columns[]=computer_id&columns[]=version&columns[]=name&columns[]=vendor" Key="computer_id" Destination="ResourceID" />
<Field Source="/api/sam/packages.json?token={$}&columns[]=computer_id&columns[]=version&columns[]=name&columns[]=vendor" Key="name" Destination="DisplayName" />
<Field Source="/api/sam/packages.json?token={$}&columns[]=computer_id&columns[]=version&columns[]=name&columns[]=vendor" Key="vendor" Destination="Publisher" />
<Field Source="/api/sam/packages.json?token={$}&columns[]=computer_id&columns[]=version&columns[]=name&columns[]=vendor" Key="version" Destination="Version" />
</Table>
</Tables>
</configuration>
@ProgMan-这是ConfigObj抽象类:
using System.Xml.Serialization;
using bdna.Extractor.I18N;
namespace bdna.Extractor.DTO
{
public abstract class ConfigObj
{
[XmlAttribute]
public string Enabled;
[XmlIgnore]
public bool IsEnabled
{
get { return string.IsNullOrEmpty(Enabled) || Enabled=="1"; }
set { Enabled = value?"1":"0"; }
}
public void DeepCopyEnableValue()
{
foreach (var prop in this.GetType().GetProperties().Where(p =>
p.PropertyType.IsSubclassOf(typeof(ConfigObj))))
{
var enableable = (ConfigObj)new
bdna.Extractor.Util.GeneralResAdapter.FastProperty(prop).Get(this);
if (enableable==null)
{
continue;
}
enableable.IsEnabled = IsEnabled;
enableable.DeepCopyEnableValue();
}
}
public void DeepDisable()
{
this.IsEnabled = false;
this.DeepCopyEnableValue();
}
}
}