Обход файла XML с использованием Linq to XML не работает должным образом - PullRequest
1 голос
/ 11 июня 2019

Извините за довольно простой вопрос, но что я могу сказать. Я не могу понять это. Проблема в том, что существует цикл foreach, который должен выполнять итерацию по строкам (разделам), и хотя он работает для первого раздела, во второй раз в цикле он, кажется, не читает второй раздел. Эти же данные хранятся в версии . Кстати, то, как метод вызывается, я бы передавал ProductName в качестве параметра (здесь будет представлено несколько продуктов, а также номер версии (например, v2.0.0), который мне понадобится для фильтрации результаты тоже.

Итак, у меня есть XML-файл, который выглядит следующим образом:

<Products>
  <ProductName1>
    <v2.0.0>
      <GUID>"{B5ECEC43-5406-4E4D-96D9-456823100313}"</GUID>
      <VersionNameToUninstall>"2.0.0 - 2.0.2"</VersionNameToUninstall>
      <UninstallResponseFile>"GVQC-Client-2.0.0-Uninst.iss"</UninstallResponseFile>
    </v2.0.0>
    <v2.0.3>
      <GUID>"{1D6C02D7-8E87-43BE-8AB2-1FF0E5ACD410}"</GUID>
      <VersionNameToUninstall>"2.0.3"</VersionNameToUninstall>
      <UninstallResponseFile>"GVQC-Client-2.0.3-Uninst.iss"</UninstallResponseFile>
    </v2.0.3>  
  </ProductName1>
  <ProductName2>
    <v3.0.0>
      <GUID>"{ABCDEC43-5406-4E4D-96D9-456823101234}"</GUID>
      <VersionNameToUninstall>"2.2.0 - 2.2.2"</VersionNameToUninstall>
      <UninstallResponseFile>"GVQC-Client-2.2.0-Uninst.iss"</UninstallResponseFile>
    </v3.0.0>
    <v4.0.0>
      <GUID>"{5D6C02D7-8E87-43BE-8AB2-1FF0E5ACD589}"</GUID>
      <VersionNameToUninstall>"4.0.0"</VersionNameToUninstall>
      <UninstallResponseFile>"GVQC-Client-4.0.0-Uninst.iss"</UninstallResponseFile>
    </v4.0.0>  
  </ProductName2>
</Products>

Всего будет около 10 версий (например, v2.x.x), поэтому здесь не так много данных. Поэтому я создал многомерный (вложенный) класс / структуру для хранения данных, и когда я пытаюсь прочитать код, он не работает.

Вот классы / структуры (я пробовал оба, и ни один из них не работает), которые я пытаюсь заполнить:

public class TopLevelObject
    {
        public string Version { get; set; }
        public RowLevelObject Row {get;set;}
    }
public struct RowLevelObject
    {
        public string Guid { get; set; }
        public string VersionName { get; set; }
        public string UninstallFileName { get; set; }
    }

Так вот мой код. Пожалуйста, просто проигнорируйте Stream - вот так я могу встроить этот XML-файл в .exe, и он не будет отдельным файлом:

public static List<TopLevelObject> GetGUIDSFromFile(string GUIDKey)

        List<InstallScriptMSIXMLTopLevelObject> installScriptMSIXMLTopLevelObjectList = new List<InstallScriptMSIXMLTopLevelObject>();

        Stream GUIDXmlFileStream = typeof(PGCommonCA).Assembly.GetManifestResourceStream("PGCommonCA.ProductGUIDs.xml");
        XElement xElement = XElement.Load(GUIDXmlFileStream);
        var versions = xElement.Elements(GUIDKey).Descendants();
        foreach (var version in versions)
        {
            TopLevelObject topLevelObject = new TopLevelObject();
            RowLevelObject rowLevelObject = new RowLevelObject();
            TopLevelObject.Version = version.Name.LocalName;

            RowLevelObject.Guid = version.Element("GUID").Value;
            RowLevelObject.VersionName = version.Element("VersionNameToUninstall").Value;
            RowLevelObject.UninstallFileName = version.Element("UninstallResponseFile").Value;
            TopLevelObjectList.Add(topLevelObject);
        }
        return TopLevelObjectList;
    }

Я знаю, что есть много способов читать XML, и мой выбор не работает, поэтому я ищу другое простое решение.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я понял это (большое спасибо jdweng !!).Вот окончательное решение, основанное на пересмотренном XML сверху:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
    const string FILENAME = @"c:\temp\test.xml";
    static TopLevelObject GetInfo(string xmlKey)
    {
        XDocument doc = XDocument.Load(FILENAME);
        XElement productName = doc.Root;

        List<TopLevelObject> top = productName.Descendants(xmlKey).Elements().Select(x => new TopLevelObject() {
            Version = x.Name.LocalName,
            Row = new RowLevelObject() {
                Guid = (string)x.Element("GUID"),
                VersionName = (string)x.Element("VersionNameToUninstall"),
                UninstallFileName = (string)x.Element("UninstallResponseFile")
            }
        }).ToList();

    }
}
public class TopLevelObject
{
    public string Version { get; set; }
    public RowLevelObject Row { get; set; }
}
public struct RowLevelObject
{
    public string Guid { get; set; }
    public string VersionName { get; set; }
    public string UninstallFileName { get; set; }
}

}

0 голосов
/ 11 июня 2019

работают следующие работы:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement productName = doc.Root;

            List<TopLevelObject> top = productName.Elements().Select(x => new TopLevelObject() {
                Version = x.Name.LocalName,
                Row = new RowLevelObject() {
                    Guid = (string)x.Element("GUID"),
                    VersionName = (string)x.Element("VersionNameToUninstall"),
                    UninstallFileName = (string)x.Element("UninstallResponseFile")
                }
            }).ToList();

        }
    }
    public class TopLevelObject
    {
        public string Version { get; set; }
        public RowLevelObject Row { get; set; }
    }
    public struct RowLevelObject
    {
        public string Guid { get; set; }
        public string VersionName { get; set; }
        public string UninstallFileName { get; set; }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...