Как вернуть значение элемента XML из потомка при передаче другого значения элемента из этого потомка - PullRequest
1 голос
/ 13 марта 2020

Я новичок в работе с LINQ до XML, но я вижу, как это может помочь моей текущей проблеме. Я хочу, чтобы метод, который вы передаете в XML Document и значение Element, затем метод возвращает другое значение элемента из того же потомка. Например, если я предоставил «StationName», я хотел бы знать, что «ScannerType» принадлежит этому «StationName»

Вот мой XML

<?xml version="1.0" encoding="utf-8" ?>
<stations>
  <station>
    <stationName>CH3CTRM1</stationName>
    <scannerType>GE LightSpeed VCT</scannerType>
    <scannerID>COL02</scannerID>
    <siteName>CUMC</siteName>
    <inspDose>180</inspDose>
    <expDose>100</expDose>
    <kernel>STANDARD</kernel>
  </station>
  <station>
    <stationName>CTAWP75515</stationName>
    <scannerType>SIEMENS Force</scannerType>
    <scannerID>UIA07</scannerID>
    <siteName>Iowa</siteName>
    <inspDose>careDose</inspDose>
    <expDose>careDose</expDose>
    <kernel>Qr40 5</kernel>
  </station>
  <station>
    <stationName>JHEB_CT06N_JHOC2</stationName>
    <scannerType>SIEMENS Force</scannerType>
    <scannerID>JHU04</scannerID>
    <siteName>JHU</siteName>
    <inspDose>careDose</inspDose>
    <expDose>careDose</expDose>
    <kernel>Qr40 5</kernel>
  </station>
</stations>

Вот методы, которые в настоящее время вопрос

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

namespace ManualPhantomProcessor.XMLParser
{
    class SearchXML
    {
        public string filename = "SiteData.xml";
        public string currentDirectory = Directory.GetCurrentDirectory();

        public XDocument LoadXML()
        {
            string siteDataFilePath = Path.Combine(currentDirectory, filename);
            XDocument siteData = XDocument.Load(siteDataFilePath);
            return siteData;

        }

        public IEnumerable<string> GetScannerModel(XDocument xmlDocument, string stationName)
        {
            var query = xmlDocument.Descendants("station")
                .Where(s => s.Element("stationName").Value == stationName)
                .Select(s => s.Element("scannerType").Value)
                .Distinct();

            return query;
        }
    }
}

Вот мой файл Programs.cs

using ManualPhantomProcessor.XMLParser;
using System;
using System.Collections.Generic;
using System.Xml.Linq;

namespace ManualPhantomProcessor
{
    class Program
    {
        static void Main(string[] args)
        {
            SearchXML searchXML = new SearchXML();

            XDocument siteData = searchXML.LoadXML();

            IEnumerable<string> data = searchXML.GetScannerModel(siteData, "CH3CTRM1");

            Console.WriteLine(data);
        }
    }
}

Я должен быть простым консольным приложением, но мне кажется, что независимо от того, что я пытаюсь, я продолжаю получать нулевое значение, когда я ожидаю значение scannerType из документа XML, который соответствует названию станции "CH3CTRM1"

приложение не обрабатывает sh, но в консоли я получаю следующее: System.Linq.Enumerable+DistinctIterator`1[System.String]

Не могли бы вы объяснить, что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 13 марта 2020

Вы видите строковую форму IEnumerable<string>, возвращаемую GetScannerModel().

Существует две возможности:

  • Ожидается, что только одна модель сканера будет быть найденным (поскольку ожидается, что имя станции будет уникальным).
  • Может быть найдено любое количество моделей сканеров.

В первом случае измените GetScannerModel(), чтобы вернуть string и сделайте так, как return query.FirstOrDefault(); (или .First(), если вы хотите исключение, если совпадение не найдено). Ваша клиентская программа остается неизменной.

Во втором случае применяется ответ @ Sajid - вам нужно каким-то образом перечислить IEnumerable, например, через foreach.

0 голосов
/ 14 марта 2020

Используйте словарь:

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

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

            List<Station> stations = doc.Descendants("station").Select(x => new Station
            {
                stationName = (string)x.Element("stationName"),
                scannerType = (string)x.Element("scannerType"),
                scannerID = (string)x.Element("scannerID"),
                siteName = (string)x.Element("siteName"),
                inspDose = (string)x.Element("inspDose"),
                expDose = (string)x.Element("expDose"),
                kernel = (string)x.Element("kernel")
            }).ToList();

            Dictionary<string, Station> dict = stations
                .GroupBy(x => x.stationName, y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }
    }
    public class Station
    {
        public string stationName {get;set;}
        public string scannerType {get;set;}
        public string scannerID {get;set;}
        public string siteName {get;set;}
        public string inspDose {get;set;}
        public string expDose {get;set;}
        public string kernel { get; set; }
    }
}
0 голосов
/ 13 марта 2020

Ваш код в порядке, проблема здесь Console.WriteLine(data); WriteLine, берите string как параметр, а не список string. для отображения названий станций используйте al oop, например, следующий код:

foreach(string stationName in data)
{
   Console.WriteLine(stationName);
}

Документация WriteLine

Я надеюсь, что это поможет вам решить проблему .

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