Я пытаюсь написать грамматику XML для OkudaKit.Я заметил, что связанная грамматика HTML работает для простого XML, но не работает с элементами или атрибутами пространства имен, поэтому первое, что я хочу сделать, это добавить их поддержку.Используя грамматику HTML в качестве шаблона, я определил ns
, а затем добавил его к tagName
и attrName
:
@multiLineComments = '<!--' '-->';
@commentState = '<';
@commentState.fallbackState = delimitState;
@delimitedString = '<?' '?>' nil;
@delimitedString = '<!DOCTYPE' '>' nil;
@delimitState.fallbackState = symbolState;
@start = any*;
any = element | text | doctype | pi | comment;
pi = DelimitedString('<?', '?>');
doctype = DelimitedString('<!DOCTYPE', '>');
element = emptyTag | startTag elementContent* endTag;
elementContent = element | text | comment | pi;
text = /[^<]+/;
emptyTag = lt tagName attr* fwdSlash gt;
startTag = lt junk? tagName attr* gt;
endTag = lt fwdSlash tagName gt;
ns = Word colon;
tagName = ns? Word;
attr = attrName eq attrValue;
attrName = ns? Word;
attrValue = QuotedString;
eq = '=';
lt = '<';
gt = '>';
fwdSlash = '/';
colon = ':';
comment = Comment;
Похоже, он должен работать (если я правильно понимаю «?»,что я, вероятно, не), но вывод испорчен.Ниже мой тестовый документ:
<?xml version="1.0" encoding="utf-8"?>
<test cats:dogs="television">
<peas vegetable="box" >
<orange />
<!-- the following makes no sense -->
<blue lion:mouse="cold"/>
<red car:desk="apple">
< envelope></ envelope>
<![CDATA[lorem ipsum]]>
<dwarves>
<dwarf>Sleepy</dwarf>
<dwarf>Dopey</dwarf>
</dwarves>
</red>
</peas>
</test>
И вот как это выглядит после того, как моя сломанная грамматика покалечила его (игнорируйте форматирование, это симпатичная печать NSXMLDocument):
<?xml version="1.0" encoding="utf-8"?>
< :cats=dogstest"television">
< =vegetable"box"peas>
<>orange</>orange
<!-- the following makes no sense -->
< :lion=mouseblue"cold"></>blue
< :car=deskred"apple">< envelope></ envelope> lorem ipsum<>dwarves
<>dwarfSleepy</>dwarf
<>dwarfDopey</>dwarf
</>dwarves
</>red
</>peas
</>test
Iм интерпретирую "?"означать «необязательно», но я думаю, что это неправильно.Я не нашел его в руководстве по грамматике ParseKit .