XML序列化,为什么我最后会有一个结束的元素?

问题描述 投票:0回答:1

我在这里做错了什么?

测试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>
c# xml xml-serialization
1个回答
2
投票

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

1
投票

下面的代码已经测试过了。 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; }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.