C# の XmlSerializer を使用します。
特定のフォルダー内のすべての xml ファイルを逆シリアル化する過程で、XmlException
"There is an error in XML document (0, 0)".
と InnerException が"There is no Unicode byte order mark. Cannot switch to Unicode".
表示されます。ディレクトリ内のすべての xml は "UTF-16" でエンコードされています。唯一の違いは、一部の xml ファイルには、逆シリアル化中に使用しているオブジェクトのクラスで定義されている要素が欠落していることです。
たとえば、フォルダーに 3 種類の xml があるとします。
file1.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
</ns0:PaymentStatus>
file2.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
<PaymentStatus2 RowNum="1" FeedID="38" />
</ns0:PaymentStatus>
file3.xml
<?xml version="1.0" encoding="utf-16"?>
<ns0:PaymentStatus xmlns:ns0="http://my.PaymentStatus">
<PaymentStatus2 RowNum="1" FeedID="38" />
<PaymentStatus2 RowNum="2" FeedID="39" Amt="26.0000" />
</ns0:PaymentStatus>
上記のxmlを表すクラスがあります:
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://my.PaymentStatus")]
[XmlRootAttribute("PaymentStatus", Namespace = "http://http://my.PaymentStatus", IsNullable = true)]
public class PaymentStatus
{
private PaymentStatus2[] PaymentStatus2Field;
[XmlElementAttribute("PaymentStatus2", Namespace = "")]
public PaymentStatus2[] PaymentStatus2 { get; set; }
public PaymentStatus()
{
PaymentStatus2Field = null;
}
}
[XmlTypeAttribute(AnonymousType = true)]
[XmlRootAttribute(Namespace = "", IsNullable = true)]
public class PaymentStatus2
{
private byte rowNumField;
private byte feedIDField;
private decimal AmtField;
public PaymentStatus2()
{
rowNumField = 0;
feedIDField = 0;
AmtField = 0.0M;
}
[XmlAttributeAttribute()]
public byte RowNum { get; set; }
[XmlAttributeAttribute()]
public byte FeedID { get; set; }
[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal Amt { get; set; }
}
次のスニペットは、私のために逆シリアル化を行います:
foreach (string f in filePaths)
{
XmlSerializer xsw = new XmlSerializer(typeof(PaymentStatus));
FileStream fs = new FileStream(f, FileMode.Open);
PaymentStatus config = (PaymentStatus)xsw.Deserialize(new XmlTextReader(fs));
}
何か不足していますか?UTF-16 を UTF-8 に手動で置き換えようとすると、問題なく動作するように見えるため、エンコード形式を使用する必要があります。