XML Parsing using XmlDocument

231
10 октября 2017, 01:33

Имею xml файл, который содержит теги Вот исходнй xml:

<MOTree>
    <MO className="BTS">
        <p name='BSC_NUM'>xxyy</p>
        <p name="frequencyBandInUse">1</p>
        <p name="gprsMsTxPwrMaxCCH1x00">0</p>
        <p name="minMsTxPower">15</p>
        <p name="msTxPwrMaxCCH1x00">0</p>
        <p name="msTxPwrMaxGSM1x00">0</p>
        <p name="insiteGateway">0</p>
        <p name="name">xxx_yyy_zzz</p>
        <p name="adaptiveLaAlgorithm">0</p>
        <p name="adminState">3</p>
    </MO>
    <MO className="BTS">
        <p name="maioOffset">0</p>
        <p name="maioStep">1</p>
        <p name="masterBcf">1</p>
        <p name="maxGPRSCapacity">100</p>
        <p name="maxNumberOfRepetition">15</p>
        <p name="maxNumberRetransmission">2</p>
        <p name="maxQueueLength">50</p>
        <p name="maxTimeLimitDirectedRetry">7</p>
    </MO>
</MOTree>

Необходимо получить общий список имен тегов

с аттрибутом name.

Answer 1

Давайте вместо устаревшего XmlDocument используем Linq2Xml.

Это делается, по сути, одной строкой методом Union.

var xml1 = XElement.Load("test1.txt");
var xml2 = XElement.Load("test2.txt");
var union = xml1.Elements("p").Union(xml2.Elements("p"), new XElementComparer())
    //.OrderBy(elem => elem.Attribute("name").Value)
    ;
var xml = new XElement("MO", union);

Раскомментировать строку, если нужен отсортированный порядок.

Дополнительно нам нужен класс, реализующий IEqualityComparer.

class XElementComparer : IEqualityComparer<XElement>
{
    public bool Equals(XElement x, XElement y)
    {
        return x.Attribute("name").Value == y.Attribute("name").Value;
    }
    public int GetHashCode(XElement obj)
    {
        return (int)obj.Attribute("name");
        //return obj.Attribute("name").Value.GetHashCode();
    }
}

Если в атрибуте name могут быть не целочисленные значения, то использовать закомментированную строку.

Answer 2

Вот что у меня получилось на первом этапе.

static void Main(string[] args)
            {
                var xml1 = XElement.Load("test1_1.txt");
                var xml2 = XElement.Load("test2_1.txt");
                var union = xml1.Descendants("p").Union(xml2.Descendants("p"), new XElementComparer());
                var xml = new XElement("MO", union);
                Console.WriteLine(xml);
                Console.ReadLine();
            }

Теперь необходимо выполнить все тоже самое, но только в пределах одного xml файла.

READ ALSO
Регистрация по email asp net web forms

Регистрация по email asp net web forms

Как сделать регистрацию в стандарстном проекте исключительно по email? Там нужно вводить username которое потом попадает в поле таблицы AspNetUsers...

260
Не работает appendСhild

Не работает appendСhild

При выполнении данного кода, страница виснет:

365
angularjs получить элемент вызвавший событие

angularjs получить элемент вызвавший событие

привет есть div который повторяется

309
увеличение фотографии [требует правки]

увеличение фотографии [требует правки]

скажите пожалуйста как могу сделать чтобы фото увеличился по 50px каждый раз увеличился по 50px а до 500px на оборот уменьшился по50px

202