我有一个大型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>
重构我构建此类的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 < ... >
}
}
该计划如下:
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);
}
}
}
}
我的元素一方面是属性TITLE =“Auftraggeber”,另一方面是TITLE =“Aufstellungsort”。我不知道如何过滤这两个案例...... 我这样试过:
if(i.ZEM01.IDOC.Z1ZRMDB.Z1ZRMPA.TITLE == "Aufstellungsort"){Console.WriteLine(...)}
但它不起作用,程序只找到i.ZEM01.IDOC.Z1ZRMDB.Z1ZRMPA.TITLE == "Auftraggeber"
。然后停止:/
答案 0 :(得分:0)
好吧,如果我没有错误,你的XML中有多个Z1ZRMPA节点,但是在你的类中它没有被描述为列表?
我想改变
[XmlElement()]
public ZRM01IDOCZ1ZRMDBZ1ZRMPA Z1ZRMPA { get; set; }
要
[XmlElement()]
public ZRM01IDOCZ1ZRMDBZ1ZRMPA List<Z1ZRMPA> { get; set; }
会解决您的问题,但当然您还必须更改支票。但我可能错了,因为这些元素名称确实令人困惑!