Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML序列化,为什么我会以一个结束的元素结束?_C#_Xml_Xml Serialization - Fatal编程技术网

C# 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:

<?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; }
    }
}