Переход с XPATH на LINQ, нужна помощь?

#c# #xml #linq #xpath

#c# #xml #linq #xpath

Вопрос:

Я пытаюсь обновить часть в моем приложении, которая считывает данные из XML-файлов. На данный момент я использую XPATH, но хочу обновиться до LINQ.

Для простых запросов XPATH, которые мне нужны, чтобы получить только 1 значение, проблем нет. но следующим методом я не могу понять, как использовать LINQ здесь. Было бы неплохо, если бы вы могли поделиться некоторыми идеями.

     public ContinuityData GetSingleContinuityResult(string pin)
    {
        ContinuityData data;

        data = new ContinuityData();

        data.PinName = pin;

        data.PreVoltage = double.Parse(ztr.SelectSingleNode("/Document/Tests/Test[contains(Name, 'Pre Continuity')]/Groups/Group/Pins/Pin[Number='"   pin   "']/Spots/Spot/VIPair/Voltage").InnerText, CultureInfo.InvariantCulture);
        data.PreCurrent = double.Parse(ztr.SelectSingleNode("/Document/Tests/Test[contains(Name, 'Pre Continuity')]/Groups/Group/Pins/Pin[Number='"   pin   "']/Spots/Spot/VIPair/Current").InnerText, CultureInfo.InvariantCulture);

        data.PostVoltage = double.Parse(ztr.SelectSingleNode("/Document/Tests/Test[contains(Name, 'Post Continuity')]/Groups/Group/Pins/Pin[Number='"   pin   "']/Spots/Spot/VIPair/Voltage").InnerText, CultureInfo.InvariantCulture);
        data.PostCurrent = double.Parse(ztr.SelectSingleNode("/Document/Tests/Test[contains(Name, 'Post Continuity')]/Groups/Group/Pins/Pin[Number='"   pin   "']/Spots/Spot/VIPair/Current").InnerText, CultureInfo.InvariantCulture);

        return data;
    }
  

Обратите внимание, что это ztr является XmlDocument экземпляром.

Вот как выглядит XML-файл: введите описание изображения здесь

Комментарии:

1. Пожалуйста, укажите структуру вашего XML-файла.

2. Готово! надеюсь, это поможет, это огромный файл!

3. Какая программа выводит это? Я вижу, как несколько человек в Google пытаются проанализировать именно эти типы файлов…

4. Это вывод старого электронного измерительного прибора, собственное программное обеспечение которого представляет собой большой беспорядок. Итак, я думаю, что, как и я, все пытаются создать свой собственный просмотрщик результатов: D он называется Mk.2

5. Но если вы имеете в виду изображение xml вверх there….it это xMLSpear!!!!

Ответ №1:

Попробуйте это

 public ContinuityData GetSingleContinuityResult(string pin)
{
    ContinuityData data;

    data = new ContinuityData();

    data.PinName = pin;

    XElement xtr = XElement.Load("path/to/your/xml/file");

    Func<string, string, string, double> getViData =
        (testName, pin, mode) =>
        Convert.ToDouble(
            xtr 
                .Descendants("Test")
                .Where(test => test.Descendants("Name")
                                   .First().Value.Contains(testName))
                .Descendants("Pin")
                .Where(p => p.Descendants("Number")
                                .First().Value == pin)
                .Descendants("VIPair")
                .Descendants(mode)
                .First().Value);

    data.PreVoltage = getViData("Pre Continuity", pin, "Voltage");
    data.PreCurrent = getViData("Pre Continuity", pin, "Current");

    data.PostCurrent = getViData("Post Continuity", pin, "Current");
    data.PostVoltage = getViData("Post Continuity", pin, "Voltage");

    return data;
}
  

Если у вас возникли проблемы с пониманием этого, пожалуйста, не стесняйтесь спрашивать!