Получение значения XML атрибутов в C# - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть это xml

<?xml version="1.0" encoding="UTF-8"?>
<rsixml2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dtd.riege.com/rsixml2/rsixml2 http://dtd.riege.com/rsixml2/rsixml2.xsd" xmlns="http://dtd.riege.com/rsixml2/rsixml2">
<!--    2.78  20170509 RSIXML2 -->
<!--    $Header: /export/cvs/procars/product/protrack/xml/rsixml2.dbs,v 1.217 2017/05/09 14:53:44 schaefer Exp $ -->
        <metadata>
                <processing>
                        <process name="AI2XML" version="1.90"/>
                        <process name="RSIXML2" version="2.78"/>
                </processing>
                <params>
                </params>
        </metadata>
<!--    generated by 1.90  20181218 AI2XML  /$Header: /export/cvs/procars/incs/misc/fillxml.dbs,v 1.58 2017/02/28 14:05:47 brink Exp $ -->
<!--    Debug info. Branch BIRDXB: plb -d  AI2XML   -sno=1202000626 -msgtyp=AIHub2Branch -sid=BIRDXB -rid=GLOBLI -FINE -rsixml2 -->
        <partners>
                <partner qual="sender" value="BIRDXB"/>
                <partner qual="receiver" value="GLOBLI"/>
        </partners>
        <shipment messageType="AIHub2Branch" status="new" type="house">
                <partners>
                        <partner qual="sender" value="BIRDXB" role="importer"/>
                        <partner qual="receiver" value="GLOBLI"/>
                        <partner qual="finalDestination" value="GLOBLI"/>
                        <partner qual="exportGateway" value="BIRCGN"/>
                        <partner qual="shipmentCreator" value="BIRCGN"/>
                </partners>
                <refs>
                        <ref qual="shipper" type="shipper" value="20208098479"/>
                        <ref qual="shipper" type="shipper" value="8400649"/>
                        <ref qual="shipment" value="1202000626" system="true"/>
                        <ref qual="procarsId" value="BIRDXB1202000626" system="true"/>
                        <ref qual="ptt" value="BIRCGN20001198693" system="true"/>
                        <ref qual="awb" value="CGN-95629985" system="true"/>
                        <ref qual="mawb" value="501-06663753" system="true"/>
                </refs>
        </shipment>
</rsixml2>

Мне нужно значение из атрибута значения отсюда

<ref qual="mawb" value="501-06663753" system="true"/>

Пока это код.

   XmlDocument doc = new XmlDocument();
            doc.Load("C:\\Users\\shaki\\Desktop\\input.xml");

            foreach (XmlNode node in doc.DocumentElement)
            {
                if (node.Name == "ref")
                {
                    string name = node.Attributes[1].InnerText;
                checkedListBox2.Items.Add(name);
            }      

                    textBox1.Text += node;

            }

Это значения в do c .DocumentElement

System.Xml.XmlCommentSystem.Xml.XmlCommentSystem.Xml.XmlElementSystem.Xml.XmlCommentSystem.Xml.XmlCommentSystem.Xml.XmlElementSystem.Xml.XmlElement

Я не понимаю, почему.

Я не пробовал LINQ, потому что не понимаю, но если это это последний выбор. я возьму это.

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Я бы предложил вам использовать LINQ для XML.
Здесь - хороший пример из MSDN.

Специально для вашего конкретного примера, предполагая, у нас есть следующая упрощенная версия XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <partners>
    <partner qual="sender" value="BIRDXB"/>
    <partner qual="receiver" value="GLOBLI"/>
  </partners>
  <shipment messageType="AIHub2Branch" status="new" type="house">
    <partners>
      <partner qual="sender" value="BIRDXB" role="importer"/>
      <partner qual="receiver" value="GLOBLI"/>
      <partner qual="finalDestination" value="GLOBLI"/>
      <partner qual="exportGateway" value="BIRCGN"/>
      <partner qual="shipmentCreator" value="BIRCGN"/>
    </partners>
    <refs>
      <ref qual="shipper" type="shipper" value="20208098479"/>
      <ref qual="shipper" type="shipper" value="8400649"/>
      <ref qual="shipment" value="1202000626" system="true"/>
      <ref qual="procarsId" value="BIRDXB1202000626" system="true"/>
      <ref qual="ptt" value="BIRCGN20001198693" system="true"/>
      <ref qual="awb" value="CGN-95629985" system="true"/>
      <ref qual="mawb" value="501-06663753" system="true"/>
    </refs>
  </shipment>
</root>

Мы можем написать следующий C# код, чтобы получить конкретный c элемент:

var xDoc = XElement.Load("address.xml"); 

var address = (
    from el in xDoc.Descendants("ref")
    where (string)el.Attribute("qual") == "mawb"
    select el
    ).FirstOrDefault();

Console.WriteLine(address?.Attribute("value")?.Value);

Хотя стоит упомянуть, что успокаивающую часть можно выполнить и с помощью методов расширения:

xDoc.Descendants("ref")
    .FirstOrDefault(el => (string)el.Attribute("qual") == "mawb");
0 голосов
/ 15 апреля 2020

Использование Xml Linq:

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

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

            List<Qual> partners = doc.Descendants(ns + "partner").Select(x => new Qual(x)).ToList();
            List<Qual> refs = doc.Descendants(ns + "ref").Select(x => new Qual(x)).ToList();

        }
    }

    public class Qual
    {
        public string qual { get; set; }
        public string value { get; set; }
        public string role { get; set; }
        public string system { get; set; }

        public Qual(XElement element)
        {
            foreach (XAttribute attribute in element.Attributes())
            {
                switch (attribute.Name.LocalName)
                {
                    case "qual" :
                        qual = ((string)attribute);
                        break;
                    case "value":
                        value = ((string)attribute);
                        break;
                    case "role":
                        role = ((string)attribute);
                        break;
                    case "system":
                        system = ((string)attribute);
                        break;
                }
            }
        }
    }
}
0 голосов
/ 15 апреля 2020

Найдено в разделе комментариев Youtube.

XmlTextReader xtr = new XmlTextReader("C:\\Users\\shaki\\Desktop\\input.xml");


            string mawb = "";
            string mawb_value = "";
            string awb = "";
            string awb_value = "";
            while (xtr.Read())
            {

                if (xtr.NodeType == XmlNodeType.Element && xtr.Name == "ref")
                {
                    xtr.MoveToAttribute("qual");
                    if(xtr.Value == "awb")
                    {
                        awb = xtr.Value;
                        xtr.MoveToAttribute("value");
                        awb_value = xtr.Value;
                        xtr.MoveToAttribute("qual");

                    }
                    if (xtr.Value == "mawb")
                    {
                        mawb = xtr.Value;
                        xtr.MoveToAttribute("value");
                        mawb_value = xtr.Value;
                        break;
                    }

                }
            }
            checkedListBox2.Items.Add(mawb + ":" + mawb_value+" "+awb+":"+awb_value);

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