Миграция с XPATH на LINQ, нужна помощь? - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь обновить часть в моем приложении, которая читает данные из файлов 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-файл: enter image description here

1 Ответ

2 голосов
/ 10 ноября 2011

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

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

Если вам трудно понять это, пожалуйста, не стесняйтесь спрашивать!

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