C# XML序列化,为什么我会以一个结束的元素结束?
我做错了什么 测试XML:C# XML序列化,为什么我会以一个结束的元素结束?,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我做错了什么 测试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> <Na
<?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>
那么我为什么要这样尝试上面的方法呢:
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>
安德鲁集团
安德鲁材料
安德鲁价值
测试以下代码。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; }
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XmlReader=XmlReader.Create(文件名);
XmlSerializer serializer=新的XmlSerializer(typeof(CutToolsDatabase));
CutToolsDatabase db=(CutToolsDatabase)序列化程序。反序列化(读取器);
}
}
[XmlRoot(ElementName=“CutToolsDatabase”,Namespace=“https//www.trucklesoft.co.uk/cuttools”)]
公共类CutToolsDatabase
{
公共刀具数据库材料组材料组;
}
公共类CutToolsDatabaseMaterialGroup
{
[XmlElement]
公共字符串名称;
[xmlement(ElementName=“Material”)]
公开材料清单;
公共刀具数据库材料组()
{
Name=“”;
材料=新列表();
}
}
公共类CutToolsDatabaseMaterial
{
公共字符串名称;
[xmlement(ElementName=“Text”)]
公开列表文本;
公共刀具数据库材料()
{
Name=“”;
}
}
公共类文本
{
公共字符串值{get;set;}
}
}
[XmlArray]
+[XmlArrayItem]
表示双重嵌套的场景,例如:
但是,在您的情况下,它们都是单独嵌套的,因此:您应该使用[xmlement]
:
[XmlRoot(ElementName=“CutToolsDatabase”,Namespace=“https//www.trucklesoft.co.uk/cuttools”)]
公共类CutToolsDatabase
{
[XmlElement(ElementName=“MaterialGroup”)]
公共列表材质组{get;}
公共CutToolsDatabase()
{
MaterialGroups=新列表();
}
}
公共类CutToolsDatabaseMaterialGroup
{
[XmlElement]
公共字符串名称{get;set;}
[xmlement(ElementName=“Material”)]
公开材料清单;
公共刀具数据库材料组()
{
Name=“”;
材料=新列表();
}
}
公共类CutToolsDatabaseMaterial
{
[XmlElement]
公共字符串名称{get;set;}
[XmlElement]
公共文本文本{get;set;}
公共刀具数据库材料()
{
Name=“”;
Text=新文本();
}
}
公共类文本
{
[XmlElement]
公共字符串值{get;set;}
}
谢谢,名称空间有什么问题吗?此外,还可以列出“值”对象“@AndrewTruckle命名空间需要在本地进行调整,但是。。。可能是复制/粘贴错误;至于值
-太好了,那么在标题中使用一个列表可以确认正在写入文件。但我的主文件中似乎没有读到它。仍然是0。为什么会这样?@AndrewTruckle lol,毕竟是xml名称空间;看起来非常非常carefully@AndrewTruckle它需要匹配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>
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; }
}
}