Чтение / Извлечение определенных элементов из файла XML C # - PullRequest
0 голосов
/ 26 июня 2018

У меня очень большой и очень сложный XML-файл, я хочу извлечь из него только очень специфические элементы. Единственные элементы, которые я хотел бы получить, - это Atcocode, NaptanCode, все элементы в дескрипторе, долгота и широта из состояния перевода и синхронизации, а также тип автобусной остановки из классификации Stop.

Я знаю, что VS может автоматически генерировать класс, но это будет анализировать ненужные детали. Любая помощь будет принята с благодарностью.

Minimal

Фрагмент из XML-файла:

<?xml version="1.0" encoding="utf-8"?>
<NaPTAN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.naptan.org.uk/" CreationDateTime="2018-03-22T08:59:00" ModificationDateTime="2018-03-22T08:59:00" Modification="new" RevisionNumber="0" FileName="NaPTAN030.xml" SchemaVersion="2.1" xsi:schemaLocation="http://www.naptan.org.uk/ http://www.naptan.org.uk/schema/2.1/NaPTAN.xsd">
  <StopPoints>
    <StopPoint CreationDateTime="2009-07-01T16:36:00" ModificationDateTime="2015-11-03T16:19:00" Modification="revise" RevisionNumber="3" Status="active">
      <AtcoCode>030028280001</AtcoCode>
      <NaptanCode>brkpjmt</NaptanCode>
      <Descriptor>
        <CommonName>Tinkers Corner</CommonName>
        <Landmark>adj Forbury Lane</Landmark>
        <Street>Holt Lane</Street>
        <Indicator>opp</Indicator>
      </Descriptor>
      <Place>
        <NptgLocalityRef>E0053849</NptgLocalityRef>
        <LocalityCentre>0</LocalityCentre>
        <Location>
          <Translation>
            <GridType>UKOS</GridType>
            <Easting>439773</Easting>
            <Northing>165685</Northing>
            <Longitude>-1.42979961186</Longitude>
            <Latitude>51.38882190967</Latitude>
          </Translation>
        </Location>
      </Place>
      <StopClassification>
        <StopType>BCT</StopType>
        <OnStreet>
          <Bus>
            <BusStopType>CUS</BusStopType>
            <TimingStatus>OTH</TimingStatus>
            <UnmarkedPoint>
              <Bearing>
                <CompassPoint>NW</CompassPoint>
              </Bearing>
            </UnmarkedPoint>
          </Bus>
        </OnStreet>
      </StopClassification>
      <StopAreas>
        <StopAreaRef CreationDateTime="2009-07-01T16:46:00" ModificationDateTime="2009-07-01T16:46:00" Modification="new" RevisionNumber="0" Status="active">030G58280001</StopAreaRef>
      </StopAreas>
      <AdministrativeAreaRef>064</AdministrativeAreaRef>
    </StopPoint>
...

Например, это был класс C #, который я имел в виду:

class Naptan
    {
        public string AtcoCode { get; set; }
        public string NaptanCode { get; set; }
        public long Latitude { get; set; }
        public long Longitude { get; set; }
        public string TimmingStatus { get; set; }
        public string BusStopType { get; set; }
        public string CommonName { get; set; }
        public string Landmark { get; set; }
        public string Street { get; set; }
        public string Indicator { get; set; }
    }

Полное

Ссылка на весь рассматриваемый XML-файл

В настоящее время я пробовал этот подход, превращая его в файл JSON, а затем анализируя его в классе, а затем вручную просматривая список объектов и создавая новый список объектов, сжатых из исходного класса.

Текущий код

EDIT

Я реализовал метод Prateek Deshmukh, однако он не извлекает конкретные элементы, как было запрошено, поэтому мне также пришлось добавить в этот новый код, что я хотел бы избежать, есть ли у кого-нибудь лучшие предложения ?:

NaPTAN tempRawData;
                XmlSerializer serializer = new XmlSerializer(typeof(NaPTAN));
                using (FileStream fileStream = new FileStream(@"F:\DfT1.xml", FileMode.Open))
                {
                    tempRawData = (NaPTAN)serializer.Deserialize(fileStream);
                }

                foreach (var StopPoint in tempRawData.StopPoints)
                {
                    Locations.Add(StopPoint.AtcoCode, new Naptan()
                    {
                        NaptanCode = StopPoint.NaptanCode,
                        Latitude = StopPoint.Place.Location.Translation.Latitude,
                        Longitude = StopPoint.Place.Location.Translation.Longitude,
                        TimmingStatus = StopPoint.StopClassification.OnStreet.Bus.TimingStatus,
                        BusStopType = StopPoint.StopClassification.OnStreet.Bus.BusStopType,
                        CommonName = StopPoint.Descriptor.CommonName,
                        Landmark = StopPoint.Descriptor.Landmark,
                        Street = StopPoint.Descriptor.Street,
                        Indicator = StopPoint.Descriptor.Indicator
                    });
                }

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Попробуйте использовать xml linq:

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);
            XElement root = doc.Root;
            XNamespace ns = root.GetDefaultNamespace();

            List<Naptan> atcoCodes = doc.Descendants(ns + "StopPoint").Select(x => new Naptan()
            {
                AtcoCode = (string)x.Element(ns + "AtcoCode"),
                NaptanCode = (string)x.Element(ns + "NaptanCode"),
                Latitude = (double)x.Descendants(ns + "Latitude").FirstOrDefault(),
                Longitude = (double)x.Descendants(ns + "Longitude").FirstOrDefault(),
                TimmingStatus = (string)x.Descendants(ns + "TimingStatus").FirstOrDefault(),
                BusStopType = (string)x.Descendants(ns + "BusStopType").FirstOrDefault(),
                CommonName = (string)x.Descendants(ns + "CommonName").FirstOrDefault(),
                Landmark = (string)x.Descendants(ns + "Landmark").FirstOrDefault(),
                Street = (string)x.Descendants(ns + "Street").FirstOrDefault(),
                Indicator = (string)x.Descendants(ns + "Indicator").FirstOrDefault()
            }).ToList();
        }
    }
    class Naptan
    {
        public string AtcoCode { get; set; }
        public string NaptanCode { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
        public string TimmingStatus { get; set; }
        public string BusStopType { get; set; }
        public string CommonName { get; set; }
        public string Landmark { get; set; }
        public string Street { get; set; }
        public string Indicator { get; set; }
    }
}
0 голосов
/ 26 июня 2018

класс CS

Вы ищете такое решение? Пожалуйста, посмотрите, какой класс десериализовал объект

NaPTAN result = (NaPTAN)serializer.Deserialize(fileStream);
...