@nikita__good

Как пропарсить XML документ C#?

Имею документ Xml.
<nmaprun>
<host starttime="1636452524" endtime="1636452524">
    <status state="up" reason="arp-response" reason_ttl="0" />
    <address addr="192.168.5.1" addrtype="ipv4" />
    <address addr="02:20:80:A8:F9:4B" addrtype="mac" />
    <hostnames />
    <ports>
      <extraports state="closed" count="994">
        <extrareasons reason="reset" count="994" proto="tcp"/>
      </extraports>
      <port protocol="tcp" portid="21">
        <state state="open" reason="syn-ack" reason_ttl="64" />
        <service name="ftp" method="table" conf="3" />
      </port>
      <port protocol="tcp" portid="22">
        <state state="filtered" reason="port-unreach" reason_ttl="64" />
        <service name="ssh" method="table" conf="3" />
      </port>
      <port protocol="tcp" portid="23">
        <state state="filtered" reason="port-unreach" reason_ttl="64" />
        <service name="telnet" method="table" conf="3" />
      </port>
      <port protocol="tcp" portid="53">
        <state state="open" reason="syn-ack" reason_ttl="64" />
        <service name="domain" method="table" conf="3" />
      </port>
      <port protocol="tcp" portid="80">
        <state state="open" reason="syn-ack" reason_ttl="64" />
        <service name="http" method="table" conf="3" />
      </port>
      <port protocol="tcp" portid="2103">
        <state state="filtered" reason="port-unreach" reason_ttl="64" />
        <service name="zephyr-clt" method="table" conf="3" />
      </port>
    </ports>
    <times srtt="1277" rttvar="990" to="100000" />
  </host>
</nmaprun>

и еще несколько узлов с под узлами
Необходимо записать данные в структуру
public class ParsBase
    {
        List<HostInfo> hostInfo;
        struct HostInfo
        {
            public string ip, mac;
            List<PortInfo> ports;
            struct PortInfo
            {
                public string nameport;
                public int num;
                public bool isOpen;
                public bool isFiltered;
            }
        }
    }

надо записать ip адрес, макадресс, порт, номер порта, открытый он или фильтруется.
код C# для парсинга
static class Parsing //парсинг результатов работы nmap
    {
        public static void ParsingReport(string path)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path);
            // получим корневой элемент
            XmlElement xMain1 = xDoc.DocumentElement;
            // обход всех узлов в корневом элементе
            foreach (XmlNode xnode2 in xMain1)
            {
             
            }
        }
    }
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
igolets
@igolets
Программист C#, MSSQL
Как я обычно с таким борюсь.

1. Сделать (или взять у поставщика XML данных) файл со схемой XSD

2. Из XSD сделать файл C# командами:
xsd SourceFormat.xsd /c /n:NameSpace /o:tmp
cd tmp
ren SourceFormat.cs     SourceFormat.designer.cs
move /y SourceFormat.designer.cs ..
cd ..
rd /s/q tmp


(кратко что тут происходит — создается .cs файл в каталоге tmp, чтобы при ошибках не затереть исходник, потом .cs переименовываем в .designer.cs и помещаем в основной каталог)

3. Оба файла (xsd и .designer.cs) можно добавить в проект, красиво отобразить второй как вложенный в первый

4. Использовать упомянутый XmlSerializer для записи
var serializer = new XmlSerializer ( typeof ( nmaprun ) );
                using ( var writer = new StreamWriter ( xmlFileName ) ) )
                {
                    serializer.Serialize ( writer, item );
                    writer.Close ();
                }


и для чтения

using ( var temp = new StringReader ( xmlText ) )
                    {
                        var tmp = serializer.Deserialize ( temp );
                        return ( nmaprun ) tmp;
                    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы