我在这里做错了什么?
测试XML。
<?xml version="1.0" encoding="utf-8"?>
<CutToolsDatabase xmlns="https//www.trucklesoft.co.uk/cuttools">
<MaterialGroup>
<Name>White Back Folding Boxboard - GC1</Name>
<Material>
<Name>296Um</Name>
<Text>
<Value>Carte Lumina 640x900 200 Gsm</Value>
</Text>
</Material>
<Material>
<Name>345Um</Name>
<Text>
<Value>Carte Lumina 450x640 230 Gsm</Value>
</Text>
</Material>
<Material>
<Name>368Um</Name>
<Text>
<Value>Opus Card 720x1020 260 Gsm</Value>
</Text>
</Material>
<Material>
<Name>375Um</Name>
<Text>
<Value>Carte Lumina 720x1020 250 Gsm</Value>
</Text>
</Material>
<Material>
<Name>398Um</Name>
<Text>
<Value>Opus Card 720x1020 280 Gsm</Value>
</Text>
</Material>
<Material>
<Name>405Um</Name>
<Text>
<Value>Carte Lumina 450x640 270 Gsm</Value>
<Value>Incada Silk 450x640 260 Gsm </Value>
</Text>
</Material>
<Material>
<Name>445Um</Name>
<Text>
<Value>Incada Silk 450x640 280 Gsm</Value>
</Text>
</Material>
<Material>
<Name>450Um</Name>
<Text>
<Value>Carte Lumina 450x640 300 Gsm</Value>
</Text>
</Material>
<Material>
<Name>485Um</Name>
<Text>
<Value>Incada Silk 450x640 300 Gsm</Value>
</Text>
</Material>
<Material>
<Name>495Um</Name>
<Text>
<Value>Carte Lumina 450x640 330 Gsm</Value>
</Text>
</Material>
<Material>
<Name>540Um</Name>
<Text>
<Value>Incada Silk 520x720 325 Gsm</Value>
</Text>
</Material>
<Material>
<Name>570Um</Name>
<Text>
<Value>Carte Lumina 450x640 380 Gsm</Value>
</Text>
</Material>
<Material>
<Name>590Um</Name>
<Text>
<Value>Incada Silk 450x640 350 Gsm</Value>
</Text>
</Material>
</MaterialGroup>
</CutToolsDatabase>
我为这个XML创建的类。
using System.Collections.Generic;
using System.Xml.Serialization;
namespace CutTools.MaterialsDatabase
{
[XmlRoot(ElementName = "CutToolsDatabase", Namespace = "https://www.trucklesoft.co.uk/cuttools")]
public class CutToolsDatabase
{
[XmlArray]
[XmlArrayItem(ElementName = "MaterialGroup")]
public List<CutToolsDatabaseMaterialGroup> MaterialGroup;
public CutToolsDatabase()
{
MaterialGroup = new List<CutToolsDatabaseMaterialGroup>();
}
}
public class CutToolsDatabaseMaterialGroup
{
[XmlElement]
public string Name;
[XmlArray]
[XmlArrayItem(ElementName = "Material")]
public List<CutToolsDatabaseMaterial> Material;
public CutToolsDatabaseMaterialGroup()
{
Name = "";
Material = new List<CutToolsDatabaseMaterial>();
}
}
public class CutToolsDatabaseMaterial
{
[XmlElement]
public string Name;
[XmlArray]
[XmlArrayItem(ElementName = "Value")]
public List<string> Text;
public CutToolsDatabaseMaterial()
{
Name = "";
Text = new List<string>();
}
}
}
我用来加载XML文件的代码。
private bool ReadMaterialsData(ref CutToolsDatabase docMaterialsDB)
{
bool bRead = false;
try
{
System.Reflection.Module mod = GetType().Module;
string strPath = Path.GetDirectoryName(mod.FullyQualifiedName);
XmlSerializer x = new XmlSerializer(docMaterialsDB.GetType());
Bricscad.ApplicationServices.Application.ShowAlertDialog(Path.Combine(strPath, "Materials.xml"));
using (StreamReader reader = new StreamReader(Path.Combine(strPath, "Materials.xml")))
{
docMaterialsDB = (CutToolsDatabase)x.Deserialize(reader);
bRead = true;
}
}
catch (System.Exception ex)
{
}
return bRead;
}
那么为什么我像这样尝试上面的操作呢?
CutToolsDatabase _docMaterialsDB = new CutToolsDatabase();
ReadMaterialsData(ref _docMaterialsDB);
_AcAp.Application.ShowAlertDialog(_docMaterialsDB.MaterialGroup.Count.ToString());
结果显示为0,到底是什么问题?我可以手动读取xml文件并使用选择路径,那么我做错了什么?
我写了一个例程来添加一些元素并将其保存到XML中。为什么它看起来像这样?
<?xml version="1.0" encoding="utf-8"?>
<CutToolsDatabase xmlns="https://www.trucklesoft.co.uk/cuttools">
<MaterialGroup>
<MaterialGroup>
<Name>Andrew Group</Name>
<Material>
<Material>
<Name>Andrew Material</Name>
<Text>
<Value>Andrew Value</Value>
</Text>
</Material>
</Material>
</MaterialGroup>
</MaterialGroup>
</CutToolsDatabase>
[XmlArray]
+[XmlArrayItem]
代表 加倍 嵌套的方案--一样。
<Foos>
<Foo/>
<Foo/>
<Foo/>
</Foos>
然而,在你的案例中,它们都是 单独 嵌套,所以:你应该使用 [XmlElement]
而不是。
[XmlRoot(ElementName = "CutToolsDatabase", Namespace = "https//www.trucklesoft.co.uk/cuttools")]
public class CutToolsDatabase
{
[XmlElement(ElementName = "MaterialGroup")]
public List<CutToolsDatabaseMaterialGroup> MaterialGroups { get; }
public CutToolsDatabase()
{
MaterialGroups = new List<CutToolsDatabaseMaterialGroup>();
}
}
public class CutToolsDatabaseMaterialGroup
{
[XmlElement]
public string Name { get; set; }
[XmlElement(ElementName = "Material")]
public List<CutToolsDatabaseMaterial> Material;
public CutToolsDatabaseMaterialGroup()
{
Name = "";
Material = new List<CutToolsDatabaseMaterial>();
}
}
public class CutToolsDatabaseMaterial
{
[XmlElement]
public string Name { get; set; }
[XmlElement]
public Text Text { get; set; }
public CutToolsDatabaseMaterial()
{
Name = "";
Text = new Text();
}
}
public class Text
{
[XmlElement]
public string Value { get; set; }
}
下面的代码已经测试过了。 XML序列化一个XmlArray是两个XML标签(父标签和子标签)。 你只有一个标签,所以你需要使用XmlElement来代替。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReader reader = XmlReader.Create(FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(CutToolsDatabase));
CutToolsDatabase db = (CutToolsDatabase)serializer.Deserialize(reader);
}
}
[XmlRoot(ElementName = "CutToolsDatabase", Namespace = "https//www.trucklesoft.co.uk/cuttools")]
public class CutToolsDatabase
{
public CutToolsDatabaseMaterialGroup MaterialGroup;
}
public class CutToolsDatabaseMaterialGroup
{
[XmlElement]
public string Name;
[XmlElement(ElementName = "Material")]
public List<CutToolsDatabaseMaterial> Material;
public CutToolsDatabaseMaterialGroup()
{
Name = "";
Material = new List<CutToolsDatabaseMaterial>();
}
}
public class CutToolsDatabaseMaterial
{
public string Name;
[XmlElement(ElementName = "Text")]
public List<Text> Text;
public CutToolsDatabaseMaterial()
{
Name = "";
}
}
public class Text
{
public string Value { get; set; }
}
}