首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML序列化,以及为什么我最终得到一个and元素?

XML序列化,以及为什么我最终得到一个and元素?
EN

Stack Overflow用户
提问于 2020-05-18 11:33:40
回答 1查看 46关注 0票数 2

我在这里做错什么了?

测试XML:

代码语言:javascript
复制
<?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创建的类:

代码语言:javascript
复制
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文件的代码:

代码语言:javascript
复制
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;
}

所以我为什么要这样做:

代码语言:javascript
复制
CutToolsDatabase _docMaterialsDB = new CutToolsDatabase();
ReadMaterialsData(ref _docMaterialsDB);
_AcAp.Application.ShowAlertDialog(_docMaterialsDB.MaterialGroup.Count.ToString());

显示的结果为0。怎么啦?我可以手动读取xml文件并使用select路径,那么我做错了什么?

我编写了一个例程来添加一些元素并将其保存到XML中。为什么看起来像这样?

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2020-05-18 11:59:51

下面的代码将被测试。XmlArray是两个XML标记(父标记和子标记)。您只有一个标记,因此需要使用XmlElement。

代码语言:javascript
复制
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; }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61868650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档