Skip to content

XML entities #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
the-Arioch opened this issue Nov 4, 2013 · 5 comments
Open

XML entities #8

the-Arioch opened this issue Nov 4, 2013 · 5 comments

Comments

@the-Arioch
Copy link
Contributor

Сделал я поиск по & QUOT ; и получается у тебя есть три несвязанных места

  1. СorrectStrForXML zexmlss.pas line 940
  2. ZEReplaceEntity zesavecommon.pas
  3. CheckStrEntity zsspxml.pas

Хрень получается...

По хорошему нужен один список замен и РЯДОМ расположенные функции перевода в обе стороны.

А нарвался я на это, когда добавил сохранение NumberFormat в XML SS

И вот тут фокус просто прекрасный... когда сохраняем - делаем подмену на entity
А когда читаем - не делаем!
А при сохранение делаем подмену поверх подмены.

Хрень какая-то, похоже у тебя парсер несимметричный относительно подмен :-/

@the-Arioch
Copy link
Contributor Author

zsspxml.pas в GetParamValue после while-цикла line 2892 просто напрашивается
Result := ZEReplaceEntity(Result)

Кто конвертирует в одну сторону - должен конвертировать и в другую.
Если парсер при записи не гонит аттрибуты как raw bytes, в переводит их в xml=compatible text, то он же должен и обратно это делать

@the-Arioch
Copy link
Contributor Author

Я посмотрел WriteTag/WriteEmptyTag/WriteInstruction и т.д.

CheckEntity = False вызывается только там, где можно гарантировать (например при записи чисел), что никаких спец-символов не будет. Т.е. это чисто оптимизация по скорости, а вовсе не закладка на какие-то хитровывернутые режимы записи XML

Но тогда и при чтении всегда должна выхываться ZEReplace - потому что мы не можем гарантировать, что непонятно кем созданный файл не будет их содержать.
Для оптимизации по скорости можно предварительно просканиировать всю строку на предмет "особенных" символов и только реально искать entities, если они были найдены. Насколько понимаю, искать нужно будет только амперсанд - без него сущностей не бывает, и кроме того искать точку с запятой после амперсанда.

Я посмотрел гдe испольюзуются ZEReplace - это фактически затыкание дыр. Как только где-то престало работать, потому что в этом тэге-аттриюуте встретились подстановки, то в виде исключения добавим обработку ещё и этого тэга.

По-моему это бесперспективно. Надо работать по стандарту XML и восстанавливать все аттрибуты и все внутренности тегов кроме CDATA

В конец концов я даже "20" имею полное право задать как & # 4 2 ; & # 4 0 ; - ИМЕЮ. И любой генератор XML - тоже.
И я уверен что оба Офиса - и МС и Апач/Либре - это нормально отпарсят. А вот библиотека - нет.

А нашлёпывать ZEReplace тут, тaм, а потом еще и вот там - и в пределе всё равно на КАЖДОМ теге и КАЖДОМ аттрибуте - это "дурная бесконечность".

Возможно я не вижу какой-то конкрентый экзотический вариант, при котором нам необходимы "неочищенные" аттрибуты и тэги - но тогда хорошо бы testcase.

@Avemey
Copy link
Owner

Avemey commented Nov 5, 2013

TZsspXMLWriter и TZsspXMLReader не являются XML генератором/парсером! Это скорее tag генератор/парсер и они делают именно то, что от них и требуются - пишут/читают тэги. К примеру спомощью TZsspXMLReader я парсю html странички (ну и можно генерировать html). Хотя согласен, xml в названии немного путает в понимании назначения, нужно было бы назвать TZsspTAG*.

@the-Arioch
Copy link
Contributor Author

И что меняется? в HMTL'е те же подстановки используются. Они в SGML и XML почти одинаковы.


Кстати, в Delphi7 и FPC - как рaботают ansiUpperCase ссо строками ,содержащими #0 в середине ? нормально или обрезают ?

@the-Arioch
Copy link
Contributor Author

Вообще реализация в D7 вроде бы такая же, как в XE2, должно работать вроде бы...

Но не знаю как в FPC, особенно на линухе.

  program Project22;

  {$APPTYPE CONSOLE}

  {$R *.res}

  uses
    System.SysUtils, AnsiStrings;

  var  us: string; _as: ansistring;

  begin
    try
      { TODO -oUser -cConsole Main : Insert code here }
      us := 'АбВ'#0'гДе'; _as := us;

      Writeln( Length( us):3,  us:20);
      Writeln( Length(_as):3, _as:20);

      us := AnsiUpperCase(us);
      _as := AnsiUpperCase(_as);

      Writeln( Length( us):3,  us:20);
      Writeln( Length(_as):3, _as:20);

      ReadLn;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  end.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants