简体   繁体   English

如何在C#中使用反序列化来过滤xml?

[英]How to filter an xml using deserialization in c#?

I have a large XML document. 我有一个很大的XML文档。 My goal is to filter and deserialize it, so that I have the information I'm interested in in an object structure. 我的目标是对其进行过滤和反序列化,以便获得对对象结构感兴趣的信息。

That's a part of the XML: 这是XML的一部分:

   <?xml version="1.0" encoding="iso-8859-1"?>
    <?xml-stylesheet type='text/xsl' href='pdfreport.xsl'?>
    <ZRM01 SYSTEM="SAPMUC">
      <IDOC BEGIN="1" TRANSFORMID="20161105203212_1">     
        <Z1ZRMDB SEGMENT="1" GRUPPE="standard" VERSION="" STATUS="bearbeitet" TRANSFERSTATUS="verschicken" PBSTATUS="1110000" TEST="" QUELLE="SAPMUC" MULTITERMIN="0" DELETE="0" DELETEREASON="" EIGENDISPO="0" QRKURZCODE="" XPathTBconfig="/DEFINES/SAPMUC/EG/X438/X438-WPBA" VorlageFilename="VorlagenSAPmuc\438-0.xml" SNDPOR="SAPTR3" EDOCXID="23e1f388-3263-459a-af0c-0c6343544058" ADRESSKEY="c20c1433-3b82-8345-8966-b0ef3741e2b4" OWNER="eDocXServer /root/SAPMUC/BearbeiteSAPMUCAusgangsdaten" PASSWORD="tkhy70ph" PASSWORD2="pjafrjg3" TRANSFORMATION="20161105203212_1" LOKALDRUCK="J">
          <OBJNR>2709323</OBJNR>
          <MABEZ>438-WPBA</MABEZ>     
          <Z1ZRMAU SEGMENT="1" TYP="">
            <KZAEN>X</KZAEN>
            <POSNR>005</POSNR>
            <ATNAM>M_WPNDAT</ATNAM>
            <CLASS>E_GEB_ALLG</CLASS>
            <MNAME>Nächste Wiederkehrende Prüfung</MNAME>
            <MWERT>01.11.2019</MWERT>
            <ATINN>0000000282</ATINN>
            <ATWRT />
          </Z1ZRMAU>
          <Z1ZRMAU SEGMENT="1" TYP="">
            <KZAEN />
            <POSNR>006</POSNR>
            <ATNAM>M_WPLDAT</ATNAM>
            <CLASS>E_GEB_ALLG</CLASS>
            <MNAME>Datum letzte Prüfung</MNAME>
            <MWERT />
            <ATINN>0000000276</ATINN>
            <ATWRT />
          </Z1ZRMAU>
          <Z1ZRMPA SEGMENT="1" DRUCK="0" ORDER="0" VISIBLE="1" ANSPRECHPARTNER="" POSTFACHADRESSE="0" XPathTBconfig="/DEFINES/SAPMUC/EG/PARVWNODES/AG" KOPIEN="1" TITLE="Auftraggeber" ENABLED="N" COLOR="ff00ffff" RESULTMAILTESTER="-2" NETDOCX="N">
            <KZAEN />
            <POSNR>000000</POSNR>
            <PARVW>AG</PARVW>
            <PARNR>100212903</PARNR>
            <NAME_LIST />
            <NAME1>Stirner GmbH</NAME1>
            <NAME2 />
            <NAME3 />
            <NAME4 />
            <CITY1>Perach</CITY1>
            <CITY2 />
            <POST_CODE1>84567</POST_CODE1>
            <POST_CODE2 />
            <STREET>Hauptstr.</STREET>
            <PO_BOX />
            <HOUSE_NUM1>23</HOUSE_NUM1>
            <COUNTRY>DE</COUNTRY>
            <LANGU>D</LANGU>
            <REGION>BY</REGION>
            <DEFLT_COMM />
            <REMARK />
            <Z1ZRMTE SEGMENT="1">
              <KZAEN />
              <COMM_TYPE>TEL</COMM_TYPE>
              <FLGDEFAULT>X</FLGDEFAULT>
              <TEL_NUMBER>08670/985580</TEL_NUMBER>
              <ETL_EXTENS />
              <REMARK />
            </Z1ZRMTE>
            <Z1ZRMTE SEGMENT="1">
              <KZAEN />
              <COMM_TYPE>FAX</COMM_TYPE>
              <FLGDEFAULT>X</FLGDEFAULT>
              <TEL_NUMBER>08670/98558</TEL_NUMBER>
              <ETL_EXTENS />
              <REMARK />
            </Z1ZRMTE>
            <Z1ZRMSM SEGMENT="1">
              <KZAEN />
              <FLGDEFAULT>X</FLGDEFAULT>
              <SMTP_ADDR>info@stirner-gmbh.de</SMTP_ADDR>
              <REMARK />
            </Z1ZRMSM>
          </Z1ZRMPA>                       
          <Z1ZRMPA SEGMENT="1" DRUCK="0" ORDER="4" VISIBLE="1" ANSPRECHPARTNER="" POSTFACHADRESSE="0" XPathTBconfig="/DEFINES/SAPMUC/EG/PARVWNODES/SA" KOPIEN="0" TITLE="Aufstellungsort" ENABLED="J" COLOR="ffffaa00" RESULTMAILTESTER="-2" NETDOCX="N">
            <KZAEN>X</KZAEN>
            <POSNR>000000</POSNR>
            <PARVW>SA</PARVW>
            <PARNR>100563034</PARNR>
            <NAME_LIST>Innpassage</NAME_LIST>
            <NAME1>Textilmarkt</NAME1>
            <NAME2>TVP12447</NAME2>
            <NAME3 />
            <NAME4 />
            <CITY1>Neuötting</CITY1>
            <CITY2 />
            <POST_CODE1>84524</POST_CODE1>
            <POST_CODE2 />
            <STREET>Simbacher Str.</STREET>
            <PO_BOX />
            <HOUSE_NUM1>55</HOUSE_NUM1>
            <COUNTRY>DE</COUNTRY>
            <LANGU>D</LANGU>
            <REGION>BY</REGION>
            <DEFLT_COMM />
            <REMARK />
            <Z1ZRMTE SEGMENT="1">
              <KZAEN />
              <COMM_TYPE>TEL</COMM_TYPE>
              <FLGDEFAULT />
              <TEL_NUMBER />
              <ETL_EXTENS />
              <REMARK />
            </Z1ZRMTE>
            <Z1ZRMSM SEGMENT="1">
              <KZAEN />
              <FLGDEFAULT />
              <SMTP_ADDR />
              <REMARK />
            </Z1ZRMSM>
          </Z1ZRMPA>         
          <PRFBER VALID="J" AUSDRUCK="lokal" KORREKTUR="" LISTE="" BEWERTUNG="G" BEWERTUNG_BESEITIGT="O">
            <PRFERG XOEXIST="N">          
              <ANLAGE>
                <PRFTXT REF="0" ENTRBEREICH="" GRUNDFLAECHE="" HERSTELLER="" STEUERZENTRALE="" RWGTYP="" ANZAUSLSTELLEN="" ANZRAUCHABZUEGE="" MANANSTEUERUNG="" AUTOANSTEUERUNG="" AUSLOESEEINR="" SOLLOEFFNUNG="" ISTOEFFNUNG="" />
                <PRFTXT REF="1" ENTRBEREICH="Textilmarkt gesamt" GRUNDFLAECHE="1626" HERSTELLER="Essmann" STEUERZENTRALE="NAS-E8G 12Volt" RWGTYP="" ANZAUSLSTELLEN="" ANZRAUCHABZUEGE="9" MANANSTEUERUNG="2" AUTOANSTEUERUNG="9" AUSLOESEEINR="pyrotechnisch" SOLLOEFFNUNG="10" ISTOEFFNUNG="18,8" />
                <PRFTXT REF="2" ENTRBEREICH="Textilmarkt Bestand" GRUNDFLAECHE="810" HERSTELLER="Essmann" STEUERZENTRALE="NAS-E8G 12Volt" RWGTYP="RAK 30 100/250 810N" ANZAUSLSTELLEN="" ANZRAUCHABZUEGE="5" MANANSTEUERUNG="2" AUTOANSTEUERUNG="5" AUSLOESEEINR="pyrotechnisch" SOLLOEFFNUNG="5" ISTOEFFNUNG="11,6" />
                <PRFTXT REF="3" ENTRBEREICH="Textilmarkt Erweiterung" GRUNDFLAECHE="416" HERSTELLER="Essmann" STEUERZENTRALE="NAS-E8G 12Volt" RWGTYP="LK-Classik 100/250 30P" ANZAUSLSTELLEN="" ANZRAUCHABZUEGE="4" MANANSTEUERUNG="2" AUTOANSTEUERUNG="4" AUSLOESEEINR="pyrotechnisch" SOLLOEFFNUNG="2,6" ISTOEFFNUNG="7,2" />
              </ANLAGE>
              <PRFTXT VALID="J" TYP="" REF="0" NR="" MEQ="N" TITEL="" RFID="" GEWICHT="0" SELECTED="" STATIST="" NUMMER="" KATEGORIE="" O-MANGEL="" X-MANGEL="" URSACHE="" VERWEIS="" VDS-KAT="" TUEV-KAT="" MANGELORT="" FALL="" />
              <PRFHNW REF="1" SELECTED="N">Teilbereiche wurden erneuert, umgebaut oder erweitert.</PRFHNW>
              <PRFHNW REF="2" SELECTED="N" Z1ZRMPA="ZH">Die Aufsichtsbehörde erhält eine Kopie dieser Bescheinigung.</PRFHNW>
              <PRFHNW REF="3" SELECTED="N">Die Mängel der vorhergehenden Prüfung wurden beseitigt.</PRFHNW>            
              <PRFTXT NUMMER="" ROWTYPE="Zwischenüberschrift" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="17" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="" FRIST="" INFO="" VERWEIS="" MANGELORT="" ANMERKUNG="" KATEGORIE="" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="" STATIST="" GEWICHT="" TUEV-KAT="" VDS-KAT="" KZAEN="" PLUGIN="" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="" COUNTSTATIST="" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Mängel</PRFTXT>
              <PRFTXT NUMMER="1" ROWTYPE="Mangel" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="18" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="Ausführungsmangel" FRIST="0" INFO="" VERWEIS="" MANGELORT="Neu installierte Rauchabzugsklappen" ANMERKUNG="" KATEGORIE="Mangel" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="ER1000 -- nicht belegt --" STATIST="ER1000" GEWICHT="1" TUEV-KAT="" VDS-KAT="" KZAEN="N" PLUGIN="3df6a705-e2e3-4ffe-93b5-71ef413c2b2f" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="J" COUNTSTATIST="784" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Es erfolgt keine Auslösung der Rauchabzugsklappen über die Rauchmelder.</PRFTXT>
              <PRFTXT NUMMER="2" ROWTYPE="Mangel" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="19" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="Betrieb" FRIST="0" INFO="" VERWEIS="" MANGELORT="Steuerzentrale" ANMERKUNG="" KATEGORIE="Mangel" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="ER1000 -- nicht belegt --" STATIST="ER1000" GEWICHT="1" TUEV-KAT="" VDS-KAT="" KZAEN="N" PLUGIN="3df6a705-e2e3-4ffe-93b5-71ef413c2b2f" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="J" COUNTSTATIST="784" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Die Steuerzentrale mit 12 Volt  ist nicht für die verwendeten Rauchmelder mit 24 Volt  geiegnet.</PRFTXT>
              <PRFTXT NUMMER="3" ROWTYPE="Mangel" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="20" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="Ausführungsmangel" FRIST="0" INFO="" VERWEIS="" MANGELORT="Alle Rauchmelder" ANMERKUNG="" KATEGORIE="Mangel" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="ER1000 -- nicht belegt --" STATIST="ER1000" GEWICHT="1" TUEV-KAT="" VDS-KAT="" KZAEN="N" PLUGIN="3df6a705-e2e3-4ffe-93b5-71ef413c2b2f" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="J" COUNTSTATIST="784" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Die Rauchmelder wurden senkrecht und nicht waggerecht montiert. Eine sichere Detektion ist somit nicht gegeben.</PRFTXT>
              <PRFTXT NUMMER="4" ROWTYPE="Mangel" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="21" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="ohne Angabe" FRIST="0" INFO="" VERWEIS="" MANGELORT="Steuerzentrale" ANMERKUNG="" KATEGORIE="Mangel" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="ER1000 -- nicht belegt --" STATIST="ER1000" GEWICHT="1" TUEV-KAT="" VDS-KAT="" KZAEN="N" PLUGIN="3df6a705-e2e3-4ffe-93b5-71ef413c2b2f" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="J" COUNTSTATIST="784" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Die Batterie ist defekt.</PRFTXT>
              <PRFTXT NUMMER="5" ROWTYPE="Mangel" PATTERN="@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" PRINT_ENUM="" REF="22" TREE_PROPERTY="" VERSION_TEXTLISTE="" QUELLE_TEXTLISTE="" URSACHE="Ausführungsmangel" FRIST="0" INFO="" VERWEIS="" MANGELORT="Steuerzentrale" ANMERKUNG="" KATEGORIE="Mangel" X-MANGEL="" O-MANGEL="" S-MANGEL="" BETRIEBSBEREICH="" TITLE="ER1000 -- nicht belegt --" STATIST="ER1000" GEWICHT="1" TUEV-KAT="" VDS-KAT="" KZAEN="N" PLUGIN="3df6a705-e2e3-4ffe-93b5-71ef413c2b2f" MEQ="" BUNDESLAND="" PRÜFUNG="" OBJEKTART="" EG_TABLE_COL01="" EG_TABLE_COL02="" EG_TABLE_COL03="" VALID="J" COUNTSTATIST="784" SELECTED="" DEFAULT_PLUGIN="" KENNUNG="" LAND="">Es erfolgt keiene Störanzeige bei Batterieausfall.</PRFTXT>                         
            </PRFERG>
          </PRFBER>        
        </Z1ZRMDB>
      </IDOC>
    </ZRM01>   

To reconstruct the structure of the XML I constructed this class: 为了重建XML的结构,我构造了此类:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;


namespace EdocX_Test_Using
{
    //ZRM01 Root Environment
    [Serializable()] 
    [XmlRoot(ElementName = "ZRM01")]
    public partial class Document
    {
        [XmlElement()]
        public ZRM01IDOC IDOC { get; set; }
    }

    //IDOC
    [Serializable()]
    public partial class ZRM01IDOC
    {
        [XmlElement()]
        public ZRM01IDOCZ1ZRMDB Z1ZRMDB { get; set; }
    }

    //IDOC Elements
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDB
    {
        public string MABEZ { get; set; } // Materialnummer
        public string OBJNR { get; set; } // Equipmentnummer

        [XmlElement()]
        public ZRM01IDOCZ1ZRMDBZ1ZRMPA Z1ZRMPA { get; set; }

        [XmlElement()]
        public ZRM01IDOCZ1ZRMDBZ1ZRMAU Z1ZRMAU { get; set; }

        [XmlElement()]
        public ZRM01IDOCZ1ZRMDBPRFBER PRFBER { get; set; }
    }

    //Z1ZRMPA --> Mandant / Gebäude
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBZ1ZRMPA
    {
        [XmlAttribute()]
        public string TITLE { get; set; } // "Auftraggeber" "Aufstellungsort"

        [XmlElement()]
        public string PARNR { get; set; } // Parnr. (Mandant)

        [XmlElement()]
        public string NAME1 { get; set; } // Name

        [XmlElement()]
        public string NAME2 { get; set; } // Name

        [XmlElement()]
        public string CITY1 { get; set; } // Stadt

        [XmlElement()]
        public string POST_CODE1 { get; set; } // PLZ

        [XmlElement()]
        public string STREET { get; set; } // Straße

        [XmlElement()]
        public string HOUSE_NUM1 { get; set; } // Hausnummer

        [XmlElement()]
        public string REGION { get; set; } // Region

        [XmlElement()]
        public string COUNTRY { get; set; } // Land

    }

    //Z1ZRMAU
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBZ1ZRMAU
    {
        [XmlElement()]
        public string MNAME { get; set; } // "Datum letze Prüfung" "Nächste Wiederkehrende Prüfung"

        [XmlElement()]
        public string MWERT { get; set; } // Durchführungsdatum bzw Fälligkeit
    }

    //PRFBER Elemts
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBPRFBER
    {
        [XmlElement()]
        public ZRM01IDOCZ1ZRMDBPRFBERPRFERG PRFERG { get; set; }
    }

    //PRFERG Elements
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBPRFBERPRFERG
    {
        [XmlElement()]
        public ZRM01IDOCZ1ZRMDBPRFBERPRFERGANLAGE ANLAGE { get; set; }
    }

    //ANLAGE
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBPRFBERPRFERGANLAGE
    {
        [XmlAttribute()]
        public string REF { get; set; } // Anzahl Anlagen

        [XmlAttribute()]
        public string HERSTELLER { get; set; } // Hersteller Anlage

        [XmlAttribute()]
        public string ENTBEREICH { get; set; } // Interne Bezeichnung Anlage
    }

    //PRFTXT
    [Serializable()]
    public partial class ZRM01IDOCZ1ZRMDBPRFBERPRFERGPRFTXT
    {
        [XmlAttribute()]
        public string KATEGORIE { get; set; } // A"Grundlage" < ... >

        [XmlAttribute()]
        public string ROWTYPE { get; set; } // "Zwischenüberschrift" (für Mangel ja/nein) "Mangel" (für Bemerkungstext)

        [XmlAttribute()]
        public string PATTERN { get; set; } // "@KATEGORIE[../@KATEGORIE='Mangel' and ../@GEWICHT[not(contains(.,'Beseitigt'))]]" < Mängel > bzw < ... >
    }
}

The program looks as follows: 该程序如下所示:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;


namespace EdocX_Test_Using
{
    class Program
    {
        static void Main(string[] args)
        {
            Program test = new Program();
            foreach (var file in Directory.GetFiles(@"N:\EGS_SDRE\OB\19_Schnittstellen_eDocX_ITAS\06_Matching EdocX-Objektbrief\01_exemplarische_XMLs_fuer_den_Import\RWA-Anlage", "*.xml"))
            {
                Console.WriteLine(file);
                if (!File.Exists(file)) { Console.WriteLine("Datei existiert nicht"); }
                test.deserializeobject(file);              
                break; // Breaks after first for now
            }           
            Console.ReadKey();

        }

        private void deserializeobject(string filename)
        {
            // new instance of XMLSerializer --> specifiying type
            var serializer = new XmlSerializer(typeof(Document));

            // read the XML document with a FileStream
            using (var fs = new FileStream(filename, FileMode.Open))
            using (var reader = XmlReader.Create(fs))
            {          
                // restore the object's state using the deserialize method
                var i = (Document)serializer.Deserialize(reader);
            }
        }
    }
}

I have the element on the one hand with the attribute TITLE = "Auftraggeber" and on the other hand with TITLE = "Aufstellungsort". 我一方面具有属性TITLE =“ Auftraggeber”的元素,另一方面具有TITLE =“ Aufstellungsort”的元素。 I have no idea how to filter the two cases... I tried it this way: 我不知道如何过滤这两种情况...我这样尝试过:

if(i.ZEM01.IDOC.Z1ZRMDB.Z1ZRMPA.TITLE == "Aufstellungsort"){Console.WriteLine(...)}

But it does not work, the program only finds i.ZEM01.IDOC.Z1ZRMDB.Z1ZRMPA.TITLE == "Auftraggeber" . 但它不起作用,该程序仅找到i.ZEM01.IDOC.Z1ZRMDB.Z1ZRMPA.TITLE == "Auftraggeber" Then it stops :/ 然后停止:/

Well, if i'm not incorrect you have multiple nodes of Z1ZRMPA in your XML, yet in your class it is not described as a list? 好吧,如果我说得不错,那么您的XML中有多个Z1ZRMPA节点,但是在您的课程中,它没有描述为列表吗?

I think changing 我认为改变

[XmlElement()]
public ZRM01IDOCZ1ZRMDBZ1ZRMPA Z1ZRMPA { get; set; }

To

[XmlElement()]
public ZRM01IDOCZ1ZRMDBZ1ZRMPA List<Z1ZRMPA> { get; set; }

Would solve your problem, though then of course you also have to change your check. 虽然可以解决您的问题,但是当然您还必须更改支票。 But I might be wrong because these element names are really confusing! 但是我可能是错的,因为这些元素名称确实令人困惑!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM