私は XML ファイルを扱うのは初めてなので、これまでのプロセス全体を説明したいと思います。誰かが私が失敗したステップを指摘してくれることを願っています。私の質問だけを見たい場合は、一番下で簡潔に質問します。
会計ソフト Peachtree で生成した XML ファイルをインポートしようとしています。これは、XML ファイルの省略された短縮バージョンです。ITEM.xml
<PAW_Items xmlns:paw="urn:schemas-peachtree-com/paw8.02-datatypes"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema-datatypes">
<PAW_Item xsi:type="paw:item">
<ID xsi:type="paw:id">00002</ID>
<Description>Example1</Description>
<Class>1</Class>
<isInactive>TRUE</isInactive>
<Subject_to_Commission>FALSE</Subject_to_Commission>
<Description_for_Sales>Example1</Description_for_Sales>
<Sales_Prices>
<Sales_Price_Info Key="1">
<Sales_Price>5.22000</Sales_Price>
<Sales_Price_Calc>NC</Sales_Price_Calc>
<Sales_Price_Rounding>0</Sales_Price_Rounding>
<Sales_Price_Rounding_Cent>0.00000</Sales_Price_Rounding_Cent>
</Sales_Price_Info>
<Sales_Price_Info Key="2">
<Sales_Price>0.00000</Sales_Price>
<Sales_Price_Calc>NC</Sales_Price_Calc>
<Sales_Price_Rounding>0</Sales_Price_Rounding>
<Sales_Price_Rounding_Cent>0.00000</Sales_Price_Rounding_Cent>
</Sales_Price_Info>
</Sales_Prices>
<Tax_Type>0</Tax_Type>
<Last_Unit_Cost>5.22000</Last_Unit_Cost>
<Costing_Method>1</Costing_Method>
<GL_Sales_Account xsi:type="paw:id">40000</GL_Sales_Account>
<GL_Inventory_Account xsi:type="paw:id">12000</GL_Inventory_Account>
<GL_COGSSalary_Acct xsi:type="paw:id">50000</GL_COGSSalary_Acct>
<Type>SA</Type>
<Stocking_UM>BTL</Stocking_UM>
<Weight>0.00000</Weight>
<Minimum_Stock>0.00000</Minimum_Stock>
<Reorder_Quantity>0.00000</Reorder_Quantity>
<Vendor_ID xsi:type="paw:id">B&L</Vendor_ID>
<Substock_Primary_Attributes>
</Substock_Primary_Attributes>
<Substock_Secondary_Attributes>
</Substock_Secondary_Attributes>
<QuantityOnSO>0.00000</QuantityOnSO>
<QuantityOnPO>0.00000</QuantityOnPO>
<QuantityOnHand>0.00000</QuantityOnHand>
<IsTaxable>TRUE</IsTaxable>
<Print_Components>FALSE</Print_Components>
<Number_of_Components>0</Number_of_Components>
<Components>
<Component>
<Effective_Date xsi:type="paw:date"/>
<Component_Number>0</Component_Number>
<Qty_Needed>0.00000</Qty_Needed>
</Component>
</Components>
</PAW_Item>
<PAW_Item xsi:type="paw:item">
<ID xsi:type="paw:id">0001</ID>
<Description>Example2</Description>
<Class>1</Class>
<isInactive>TRUE</isInactive>
<Subject_to_Commission>FALSE</Subject_to_Commission>
<Description_for_Sales>Example2</Description_for_Sales>
<Sales_Prices>
<Sales_Price_Info Key="1">
<Sales_Price>4.39000</Sales_Price>
<Sales_Price_Calc>NC</Sales_Price_Calc>
<Sales_Price_Rounding>0</Sales_Price_Rounding>
<Sales_Price_Rounding_Cent>0.00000</Sales_Price_Rounding_Cent>
</Sales_Price_Info>
<Sales_Price_Info Key="2">
<Sales_Price>0.00000</Sales_Price>
<Sales_Price_Calc>NC</Sales_Price_Calc>
<Sales_Price_Rounding>0</Sales_Price_Rounding>
<Sales_Price_Rounding_Cent>0.00000</Sales_Price_Rounding_Cent>
</Sales_Price_Info>
</Sales_Prices>
<Tax_Type>0</Tax_Type>
<Last_Unit_Cost>4.39000</Last_Unit_Cost>
<Costing_Method>1</Costing_Method>
<GL_Sales_Account xsi:type="paw:id">40000</GL_Sales_Account>
<GL_Inventory_Account xsi:type="paw:id">12000</GL_Inventory_Account>
<GL_COGSSalary_Acct xsi:type="paw:id">50000</GL_COGSSalary_Acct>
<Type>SA</Type>
<Stocking_UM>EA</Stocking_UM>
<Weight>0.00000</Weight>
<Minimum_Stock>0.00000</Minimum_Stock>
<Reorder_Quantity>0.00000</Reorder_Quantity>
<Substock_Primary_Attributes>
</Substock_Primary_Attributes>
<Substock_Secondary_Attributes>
</Substock_Secondary_Attributes>
<QuantityOnSO>0.00000</QuantityOnSO>
<QuantityOnPO>0.00000</QuantityOnPO>
<QuantityOnHand>0.00000</QuantityOnHand>
<IsTaxable>TRUE</IsTaxable>
<Print_Components>FALSE</Print_Components>
<Number_of_Components>0</Number_of_Components>
<Components>
<Component>
<Effective_Date xsi:type="paw:date"/>
<Component_Number>0</Component_Number>
<Qty_Needed>0.00000</Qty_Needed>
</Component>
</Components>
</PAW_Item>
</PAW_Items>
私が最初にしたことは、次のコマンドでXML スキーマ定義ツールを使用して、XML ファイルに基づいて XSD ファイルを作成することでした。
xsd ITEM.xml
これにより、2 つの XSD ファイルが生成されITEM.xsd
、ITEM_app1.xsd
ITEM.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="PAW_Items" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:app1="http://www.w3.org/2000/10/XMLSchema-instance">
<xs:import namespace="http://www.w3.org/2000/10/XMLSchema-instance" schemaLocation="ITEM_app1.xsd" />
<xs:element name="PAW_Items" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="PAW_Item">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="xs:string" minOccurs="0" msdata:Ordinal="1" />
<xs:element name="Class" type="xs:string" minOccurs="0" msdata:Ordinal="2" />
<xs:element name="isInactive" type="xs:string" minOccurs="0" msdata:Ordinal="3" />
<xs:element name="Subject_to_Commission" type="xs:string" minOccurs="0" msdata:Ordinal="4" />
<xs:element name="Description_for_Sales" type="xs:string" minOccurs="0" msdata:Ordinal="5" />
<xs:element name="Tax_Type" type="xs:string" minOccurs="0" msdata:Ordinal="6" />
<xs:element name="Last_Unit_Cost" type="xs:string" minOccurs="0" msdata:Ordinal="7" />
<xs:element name="Costing_Method" type="xs:string" minOccurs="0" msdata:Ordinal="8" />
<xs:element name="Type" type="xs:string" minOccurs="0" msdata:Ordinal="9" />
<xs:element name="Stocking_UM" type="xs:string" minOccurs="0" msdata:Ordinal="10" />
<xs:element name="Weight" type="xs:string" minOccurs="0" msdata:Ordinal="11" />
<xs:element name="Minimum_Stock" type="xs:string" minOccurs="0" msdata:Ordinal="12" />
<xs:element name="Reorder_Quantity" type="xs:string" minOccurs="0" msdata:Ordinal="13" />
<xs:element name="Substock_Primary_Attributes" type="xs:string" minOccurs="0" msdata:Ordinal="14" />
<xs:element name="Substock_Secondary_Attributes" type="xs:string" minOccurs="0" msdata:Ordinal="15" />
<xs:element name="QuantityOnSO" type="xs:string" minOccurs="0" msdata:Ordinal="16" />
<xs:element name="QuantityOnPO" type="xs:string" minOccurs="0" msdata:Ordinal="17" />
<xs:element name="QuantityOnHand" type="xs:string" minOccurs="0" msdata:Ordinal="18" />
<xs:element name="IsTaxable" type="xs:string" minOccurs="0" msdata:Ordinal="19" />
<xs:element name="Print_Components" type="xs:string" minOccurs="0" msdata:Ordinal="20" />
<xs:element name="Number_of_Components" type="xs:string" minOccurs="0" msdata:Ordinal="21" />
<xs:element name="ID" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="ID_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute ref="app1:type" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Sales_Prices" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Sales_Price_Info" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Sales_Price" type="xs:string" minOccurs="0" msdata:Ordinal="0" />
<xs:element name="Sales_Price_Calc" type="xs:string" minOccurs="0" msdata:Ordinal="1" />
<xs:element name="Sales_Price_Rounding" type="xs:string" minOccurs="0" msdata:Ordinal="2" />
<xs:element name="Sales_Price_Rounding_Cent" type="xs:string" minOccurs="0" msdata:Ordinal="3" />
</xs:sequence>
<xs:attribute name="Key" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GL_Sales_Account" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="GL_Sales_Account_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute ref="app1:type" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="GL_Inventory_Account" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="GL_Inventory_Account_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute ref="app1:type" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="GL_COGSSalary_Acct" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="GL_COGSSalary_Acct_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute ref="app1:type" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Vendor_ID" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="Vendor_ID_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute ref="app1:type" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Components" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Component" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Component_Number" type="xs:string" minOccurs="0" />
<xs:element name="Qty_Needed" type="xs:string" minOccurs="0" />
<xs:element name="Effective_Date" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute ref="app1:type" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute ref="app1:type" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
ITEM_app1.xsd:
<?xml version="1.0" standalone="yes"?>
<xs:schema targetNamespace="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:mstns="http://www.w3.org/2000/10/XMLSchema-instance" xmlns="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://www.w3.org/2000/10/XMLSchema-instance">
<xs:attribute name="type" msdata:Prefix="xsi" type="xs:string" />
</xs:schema>
次に、コマンドを使用しようとしましたxsd ITEM.xsd /c
が、うまくいきませんでした。
E:\test>xsd ITEM.xsd /c Microsoft (R) Xml Schemas/DataTypes サポート ユーティリティ 【マイクロソフト(R) .NET Framework バージョン4.0.30319.17929】 Copyright (C) Microsoft Corporation. 全著作権所有。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 113、位置 14。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 35、位置 24。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 61、位置 24。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 70、位置 24。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 79、位置 24。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 88、位置 24。 スキーマ検証の警告: 「http://www.w3.org/2000/10/XMLSchema-instance:type」属性が宣言されていません。行 103、位置 32。 警告: スキーマを検証できませんでした。クラスの生成が失敗するか、正しくない結果が生成される可能性があります。 エラー: スキーマ 'ITEM' のクラスを生成中にエラーが発生しました。 - 属性タイプがありません。 さらにヘルプが必要な場合は、「xsd /?」と入力してください。
両方のファイルを使用してリストしようとしても機能しません。少し検索した後、引数ITEM_app1.xsd
を使用すると複数のファイルをリストできることがわかりました。/parameters
そこで、次のパラメーターファイルを作成しました
<xsd xmlns='http://microsoft.com/dotnet/tools/xsd/'>
<generateClasses language='CS' namespace='Peachtree'>
<schema>ITEM.xsd</schema>
<schema>ITEM_app1.xsd</schema>
</generateClasses>
</xsd>
そして、それは正常に作成されました(ここに投稿すると、この質問が投稿サイズの最大制限を超えるため、pastebin でコードITEM_ITEM_app1.cs
のコピーを取得できます)
この簡単なプログラムを作成してテストしました
using System.Diagnostics;
using System.IO;
using System.Xml.Serialization;
using Peachtree;
namespace Sandbox_Console
{
public class Program
{
private static void Main(string[] args)
{
using (var file = File.OpenText(@"E:\test\ITEM.xml"))
{
var ser = new XmlSerializer(typeof(PAW_Items)); //Line 16
var result = (PAW_Items) ser.Deserialize(file);
Debugger.Break();
}
}
}
}
最初に実行しようとしたときに、この例外が発生しました
System.InvalidOperationException occurred
HResult=-2146233079
Message=Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Peachtree.PAW_ItemsPAW_ItemSales_PricesSales_Price_Info[]' to 'Peachtree.PAW_ItemsPAW_ItemSales_PricesSales_Price_Info'
error CS0030: Cannot convert type 'Peachtree.PAW_ItemsPAW_ItemComponentsComponent[]' to 'Peachtree.PAW_ItemsPAW_ItemComponentsComponent'
error CS0029: Cannot implicitly convert type 'Peachtree.PAW_ItemsPAW_ItemSales_PricesSales_Price_Info' to 'Peachtree.PAW_ItemsPAW_ItemSales_PricesSales_Price_Info[]'
error CS0029: Cannot implicitly convert type 'Peachtree.PAW_ItemsPAW_ItemComponentsComponent' to 'Peachtree.PAW_ItemsPAW_ItemComponentsComponent[]'
Source=System.Xml
StackTrace:
at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at Sandbox_Console.Program.Main(String[] args) in e:\Code\Sandbox Console\Program.cs:line 16
InnerException:
ただし、複雑な型に複雑な型がある場合、これはxsd.exeの既知の問題であることがわかりました。[][]
生成さ[]
れたファイルで必要な2つのクラスを変更しただけで、問題が解決しました。
私の問題:
ファイルを逆シリアル化しようとすると、次の例外が発生します
System.InvalidOperationException occurred
HResult=-2146233079
Message=There is an error in XML document (4, 3).
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
at Sandbox_Console.Program.Main(String[] args) in e:\Code\Sandbox Console\Program.cs:line 16
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=The specified type was not recognized: name='item', namespace='urn:schemas-peachtree-com/paw8.02-datatypes', at <PAW_Item xmlns=''>.
Source=Microsoft.GeneratedCode
StackTrace:
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPAW_Items.Read10_PAW_ItemsPAW_Item(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPAW_Items.Read11_PAW_Items(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPAW_Items.Read12_PAW_Items()
InnerException:
爆発している<PAW_Item xsi:type="paw:item">
ようで、部品をどうしたらよいかわかりませんxsi:type="paw:item"
。
PAW_ItemsPAW_Item
コードを次のように変更して、既知の型に追加しようとすると
var types = new[] {typeof (PAW_ItemsPAW_Item)}; //Line 15
var ser = new XmlSerializer(typeof(PAW_Items), types);
var result = (PAW_Items) ser.Deserialize(file);
new XmlSerializer(...)
行に次のエラーが表示されます
System.InvalidOperationException occurred
HResult=-2146233079
Message=Cannot include anonymous type 'Peachtree.PAW_ItemsPAW_Item'.
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlReflectionImporter.IncludeType(Type type, RecursionLimiter limiter)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, XmlAttributeOverrides overrides, Type[] extraTypes, XmlRootAttribute root, String defaultNamespace, String location, Evidence evidence)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, Type[] extraTypes)
at Sandbox_Console.Program.Main(String[] args) in e:\Code\Sandbox Console\Program.cs:line 15
InnerException:
これが発生する原因となっているのは、どのステップを逃したのですか?