c# – 将元素动态添加到XML文件

前端之家收集整理的这篇文章主要介绍了c# – 将元素动态添加到XML文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用这个代码制作一个 XML文件,在这里我创建一个对象,每次调用方法时都会写入一个XML文件
public static void TileMapCapabilities(string title,TilePicker picker)
        {
        var dbInfo = picker.GetCapabilitiesInfo();

        TileMapObject tmo = new TileMapObject()
        {
            Title = title,Abstract = "",KeywordList = new KeywordList() {FirstLayer = ""},SRS = "OSGEO:41001",Profile = "local",Format = "image/png",BoundingBox = dbInfo.eBoundingBox,MapSize = dbInfo.mapSize,CellSize = dbInfo.cellSize,MaxLevel = dbInfo.level,Location = dbInfo.location // Not sure if this should be here. Could be practical in scenarios where the tile server is hosted locally.
        };}

它的工作正常,可能看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<TileMapServicesObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TileMapService>
   <Title>EivaTMS</Title>
    <Abstract>Something clever about this service</Abstract>
    <TileMaps>
      <TileMap>
        <Title>kraken.db</Title>
        <href>10.10.100.200/kraken.db?request=getcapabilities</href>
        <Profile>global-mercator</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
    </TileMaps>
  </TileMapService>
</TileMapServicesObject>

现在,我想做的是创建一个描述上面提到的层的XML文件.换句话说,我想要一个XML文件,其中描述了我上面提到的每个XML文件.

我已经设法做了一些工作,如果我在代码中编写代码,它将如下所示:

public static void TileMapServicesCapabilities(int listBoxCount)
        {         

        TileMapServicesObject tmso = new TileMapServicesObject()
        {
            TileMapService = new TileMapService()
            {
                Title = "EivaTMS",Abstract = "Something clever about this service",TileMaps = new List<TileMap>
                {
                    new TileMap { Title = "title1",href = "http://title1/?request=getcapabilities",Profile = "global-mercator",SRS = "OSGEO:41001"},new TileMap { Title = "title2",href = "http://title2/?request=getcapabilities",new TileMap { Title = "title3",href = "http://title3/?request=getcapabilities",SRS = "OSGEO:41001"}
                }
            }
        };}

哪个产生这个输出

<?xml version="1.0" encoding="utf-8"?>
<TileMapServicesObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TileMapService>
    <Title>EivaTMS</Title>
    <Abstract>Something clever about this service</Abstract>
    <TileMaps>
      <TileMap>
        <Title>title1</Title>
        <href>http://title1/?request=getcapabilities</href>
        <Profile>global-mercator</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
      <TileMap>
        <Title>title2</Title>
        <href>http://title2/?request=getcapabilities</href>
        <Profile>global-mercator</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
      <TileMap>
        <Title>title3</Title>
        <href>http://title3/?request=getcapabilities</href>
        <Profile>global-mercator</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
    </TileMaps>
  </TileMapService>
</TileMapServicesObject>

现在,我想做的是动态创建和添加元素.这意味着对于我通过第一个方法TileMapCapabilities创建的每个XML文件,我想创建一个对象并将其添加到TileMapServicesObject.可能还值得一提的是,类看起来包含正在创建的对象中的信息:

public class TileMapServicesObject
    {
        public TileMapService TileMapService { get; set; }
    }

    public class TileMapService
    {
        public string Title { get; set; }
        public string Abstract { get; set; }
        public List<TileMap> TileMaps { get; set; }
    }

    public class TileMap
    {
        public string Title { get; set; }
        public string href { get; set; }
        public string Profile { get; set; }
        public string SRS { get; set; }
    }

我一直在尝试一个foreach循环,为我添加到服务中的每个TileMap创建一个TileMap对象,但是这为每次迭代创建了一个新的TileMapServicesObject,而不是包含所有对象的单个文件.

有什么提示我如何处理这个问题?如果我的请求在当前形式太模糊,请让我知道.

编辑:结果只是盯着它,足够长的时间固定它!

以下是更新的代码

public static void TileMapServicesCapabilities()
    {
        TileMapServicesObject tmso = new TileMapServicesObject();
        List<string> pathList = new List<string>(); 
        pathList = Directory.GetFiles(path + @"Tilemaps\").ToList();
        List<TileMap> tmList = new List<TileMap>();
        TileMap tm = new TileMap();
        string title = "";
        string profile = "";
        string srs = "";

        foreach (var p in pathList)
        {
            var xRead = XDocument.Load(p);

            var xd = (from el in xRead.Descendants("TileMapObject")
                    select new 
                    {
                        Title = el.Element("Title").Value,Profile = el.Element("Profile").Value,SRS = el.Element("SRS").Value
                    }).SingleOrDefault();

            title = xd.Title;
            profile = xd.Profile;
            srs = xd.SRS;

            tm = new TileMap()
            {
                Title = title,Profile = profile,SRS = srs,href = "http://10.10.100.200/" + title + "?request=getcapabilities"
            };

            tmList.Add(tm);
        }

        tmso = new TileMapServicesObject()
        {
            TileMapService = new TileMapService()
            {
                Title = "EivaTMS",TileMaps = tmList
            }
        };

这给了我这个漂亮的XML文件

<?xml version="1.0" encoding="utf-8"?>
<TileMapServicesObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <TileMapService>
    <Title>EivaTMS</Title>
    <Abstract>Something clever about this service</Abstract>
    <TileMaps>
      <TileMap>
        <Title>title1</Title>
        <href>http://title1?request=getcapabilities</href>
        <Profile>local</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
      <TileMap>
        <Title>title2</Title>
        <href>http://title2?request=getcapabilities</href>
        <Profile>local</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
      <TileMap>
        <Title>title3</Title>
        <href>http://title3?request=getcapabilities</href>
       <Profile>local</Profile>
       <SRS>OSGEO:41001</SRS>
      </TileMap>
      <TileMap>
        <Title>title4</Title>
        <href>http://title4?request=getcapabilities</href>
        <Profile>local</Profile>
        <SRS>OSGEO:41001</SRS>
      </TileMap>
    </TileMaps>
  </TileMapService>
</TileMapServicesObject>

解决方法

好的,我设法解决了这个几个小时,盯着它!

原来我只能做一个foreach(),我将遍历所有要读取的文件,创建一个TileMap对象并将其添加到List中,然后在foreach()之后写入XML.我用我的新代码更新了OP.

猜你在找的C#相关文章