nikoMedlem sedan juni 20022 599 inlägg Håller på att skriva en applikation som ska parsa ett hemmagjort XML-liknande kommandospråk som skickas till den över en viss port.
Ett typiskt "kommandopaket ser ut så här:
<kommandonamn>
<delkommando>indata[1]1[/1]
<extraparameter1>parameterdata1</extraparameter1>
<extraparameter2>parameterdata2</extraparameter2>
</delkommando>
..
..
<delkommando>indata[1]n[/1]
<extraparameter1>parameterdata1</extraparameter1>
<extraparameter2>parameterdata2</extraparameter2>
</delkommando>
</kommandonamn>
Eftersom paketen kan vara godtyckligt långa så kom jag på idén att snickra ihop en DTD som direkt kan förkasta felaktiga paket innan jag börjar snurra igenom dem. Problemet är att jag upptäckt att jag inte är bra på att skriva DTD:er.
Så för att göra en lång fråga kort: Hur uttrycker jag följande:
1. kommandonamn innehåller godtyckligt många delkommando, men minst ett.
2. Ett delkommando måste innehålla indata som måste komma före extraparameter1 och extraparameter2.
3. extraparameter1 och extraparameter2 måste båda förekomma exakt en gång (efter indata som sagt).
Det som ställer till det för mig är indata som är ren text som jag antar jag bör deklarera som PCDATA?
SPiNMedlem sedan mars 20007 896 inlägg Du vill inte använda schemas? Ett schema för dig skulle kunna se ut så här:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="kommandonamn">
<xs:complexType>
<xs:sequence>
<xs:element name="delkommando">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="extraparameter1" type="xs:string" />
<xs:element name="extraparameter2" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
nikoMedlem sedan juni 20022 599 inlägg Tack för svaret. Du får direkt två följdfrågor:
Du vill inte använda schemas?
Ja, jo .. kanske. Anledningen till att jag valde en DTD är att jag kan bädda in den i de XML-paket jag får helt enkelt genom att klippa på den innan jag börjar parsa.
Går det att göra nåt liknande med schemas? Jag vill undvika fil-IO och HTTP är uteslutet.
Löser ditt schema mitt problem med ordningsföljden mellan indata och extraparametrarna?
Jag vill egentligen ha min DTD så här:
<!DOCTYPE kommandonamn [
<!ELEMENT kommandonamn (delkommando+)>
<!ELEMENT delkommando (#PCDATA,extraparameter1,extraparameter2)>
<!ELEMENT extraparameter1 (#PCDATA)>
<!ELEMENT extraparameter2 (#PCDATA)>
Fast då gnäller MSXML på "Mixed content model cannot contain this character." och av vad jag läst mig till så är det kommatecknen den syftar på. Jag måste istället skriva:
<!ELEMENT delkommando (#PCDATA|extraparameter1|extraparameter2)*>
Fast då förlorar jag kontrollen över ordningsföljden, vilket jag ju inte vill.
SPiNMedlem sedan mars 20007 896 inlägg <!ELEMENT delkommando ((#PCDATA),extraparameter1,extraparameter2)*>
:q
nikoMedlem sedan juni 20022 599 inlägg Tyvärr. Då får jag istället:
A name was started with an illegal character.
SPiNMedlem sedan mars 20007 896 inlägg Ja, det var en liten chansning... Jag antog att man inte kunde göra så, men det var kanske värt ett försök? ;)
I schemas kan du inte bestämma ordningen på var texten ska hamna, endast på elementen - texten kan således vara innan, efter eller mitt emellan dina element. Parsen bryr sig inte.
Jag kan tyvärr inte hjälpa dig mer, för jag tror inte att ditt problem går att lösa - utan att förlora kontrollen över ordningsföljden.
nikoMedlem sedan juni 20022 599 inlägg
Jag kan tyvärr inte hjälpa dig mer, för jag tror inte att ditt problem går att lösa - utan att förlora kontrollen över ordningsföljden.
Nej, jag misstänker att du har rätt (har kollat lite på nätet). Som det är nu så funkar allt redan. Min tanke var bara att jag kunde tjäna några värdefulla millisekunder under min manuella parsning om jag kunde förutsätta att allt låg på rätt plats (och i rätt antal). Men, men .. (det är iaf inte jag som gjort protokollet. Tack ändå.