Я не хочу разбирать некоторые теги в XML - PullRequest
3 голосов
/ 22 августа 2010

В настоящее время это будет образец XML, над которым я работаю:

<smsq>
  <sms>
  <id>96</id>
  <to>03333560511</to>
  <msg>  danial says: hahaha <space> nothing.
  </msg>
  </sms>
</smsq>

Теперь обратите внимание, что тег может содержать другие теги (которые не должны анализироваться), и мне пришлось сделать dtd для этого. Dtd был что-то вроде этого:

<!DOCTYPE smsq [
  <!ELEMENT sms (mID,to,msg,type)>
  <!ELEMENT mID (#PCDATA)>
  <!ELEMENT to (#PCDATA)>
  <!ELEMENT msg (CDATA)>
]>

Но проблема в том, что анализатор XML по-прежнему идет в теге и говорит, что тег должен быть закрыт тегом. Я просто хочу получить данные как они есть из XML, и я не хочу анализировать сообщения далее.

Пожалуйста, помогите мне решить проблему и скажите, можно ли это сделать с помощью DTD.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 22 августа 2010

Вы не можете создать DTD, который делает глючный XML магическим, а не глючным. XML не является правильно сформированным, поэтому он никогда не может быть валидным, так как корректность является обязательным условием валидности (валидность здесь даже не важна, AFAICT). Это аналогично тому, как все слова в английском предложении должны быть английскими словами, прежде чем оно станет грамматически правильным английским предложением.

<space> не закрыто. У него должно быть либо </space> внутри <msg>, его следует заменить на <space/>, либо, если вы говорите, что не хотите, чтобы оно было разбито, вы имеете в виду, что вам нужен фактический текст "<space>", тогда закодируйте его как таковой (т.е. &lt;space&gt;).

3 голосов
/ 22 августа 2010

DTD не может помочь вам с этой проблемой. DTD ни в коем случае не требуется (хотя его очень удобно иметь).

Отправленный выше документ не является действительным документом XML. Период. Так оно и есть, и ни один разумный анализатор XML не проанализирует его для вас без сообщения об ошибке.

Однако вы можете заменить символ < на &lt; сущность XML.

1 голос
/ 22 августа 2010

Все теги XML должны быть закрыты, например <tag></tag> или <tag />.

Если вы хотите, чтобы тег <space> анализировался как текстовое значение тега, а не какдочерний тег, используйте &lt; и &gt; вместо < и >:

&lt;space&gt;
1 голос
/ 22 августа 2010

Во-первых, образец xml на самом деле не является xml, так как тег "пробел" не закрыт.

Во-вторых, похоже, что причина того, что нежелание разбирать тег «space», заключается в том, что он на самом деле не xml - просто текст, похожий на xml. Текст должен быть либо экранирован / закодирован, либо заключен в теги CDATA.

И наконец - если то, что вы хотите проанализировать, это действительно xml, и вы хотите анализировать только теги первого уровня. Я не стал бы беспокоиться о реальном синтаксическом анализаторе XML - я бы создал свой собственный сверхпростой синтаксический анализатор - все, что от него требуется, - это анализ узлов 1-го уровня - это не должно быть слишком сложно.

Удачи!

0 голосов
/ 22 августа 2010

Я бы выделил решение вашей проблемы в метод и решил бы его просто сейчас.В конце концов, вы не можете контролировать правильность содержимого сообщения.

private static String getMessage(String msg){
    return msg.substring(msg.indexOf("<msg>")+5, msg.lastIndexOf("</msg>"));
}//method

Вы можете улучшить его позже, когда станет доступно больше вариантов использования.

Редактировать: если кто-то помещает элемент «msg» в контент, он все равно работает

...