2016-01-08 5 views
1

У меня есть контент, который не является ни допустимым HTML, ни XML в моей старой базе данных. Учитывая тот факт, что было бы сложно очистить наследие, я хочу убрать это в MarkLogic, используя xdmp: tidy. В настоящее время я использую ML-8.Как упорядочить инструкции по обработке в Marklogic

<sub> 
    <p> 
     <???&dagger;?> 
    </p> 
</sub> 

Я передаю это содержание кругленькой функциональности таким образом:

declare variable $xml as node() := 
     <content> 
      <![CDATA[<p><???&dagger;?></p>]]> 
     </content>; 

xdmp:tidy(xdmp:quote($xml//text()), 
    <options xmlns="xdmp:tidy"> 
    <assume-xml-procins>yes</assume-xml-procins> 
    <quiet>yes</quiet> 
    <tidy-mark>no</tidy-mark> 
    <enclose-text>yes</enclose-text> 
    <indent>yes</indent> 
    </options>) 

В результате он возвращает:

<p> 
<? ?&dagger;?> 
</p> 

Теперь этот результат не является форматом XML действительного (Я проверил его с помощью проверки XML), из-за чего, когда я пытаюсь вставить этот XML в MarkLogic, он выдает сообщение об ошибке «MALFORMED BODY | Недопустимые имена команд обработки ".

Я провел некоторое расследование вокруг ИП, но не очень повезло. Я мог бы попытаться сохранить содержимое без PI, но это тоже не действительный PI.

+0

вы можете дать пример того, что вы ожидать, что инструкция по обработке будет выглядеть? –

+0

Пожалуйста, воздержитесь от срочной просьбы - ни один вопрос не может перескочить в очередь, а добровольцы не спешат на торопиться. – halfer

ответ

6

Это потому, что то, что вы считаете ПИ, на самом деле не является ПИ. От W3C:

2,6 Обработка Инструкции

[Определение: Обработка инструкции (ИП) позволяют документы содержат инструкции для приложений.]

Инструкции по обработке

[16] PI: : = '' Char *)))?

[17] PITarget :: = Имя - (('X' | 'х') ('М' | 'т') ('L' | 'л')) '>?'

Значит, имя PI не может начаться? как в вашем образце & кинжал; Возможно, вы захотите очистить содержимое, прежде чем передавать его, чтобы привести его в порядок. Как показано ниже:

declare variable $xml as node() := 
    <content><![CDATA[<p>Hello <???&dagger;?>world</p>]]></content>; 

declare function local:copy($input as item()*) as item()* { 
    for $node in $input 
    return 
    typeswitch($node) 
    case text() 
     return fn:replace($node,"<\?[^>]+\?>","") 
    case element() 
     return 
      element {name($node)} { 

      (: output each attribute in this element :) 
      for $att in $node/@* 
       return 
        attribute {name($att)} {$att} 
      , 
      (: output all the sub-elements of this element recursively :) 
      for $child in $node 
       return local:copy($child/node()) 

      } 
    (: otherwise pass it through. Used for text(), comments, and PIs :) 
    default return $node 
}; 

xdmp:tidy(local:copy($xml), 
    <options xmlns="xdmp:tidy"> 
    <assume-xml-procins>no</assume-xml-procins> 
    <quiet>yes</quiet> 
    <tidy-mark>no</tidy-mark> 
    <enclose-text>yes</enclose-text> 
    <indent>yes</indent> 
    </options>) 

Это будет делать трюк, чтобы избавиться от всех НЦБ (реальная и подделка Pis)

С уважением,

Питер

+1

Этот ответ является действительным и полным [и удивительно подробным]. Дорогой Rachit - играйте хорошо с StackOverflow. Вы просили срочно ответить, люди нашли время, чтобы дать удивительно подробный ответ. Теперь, пожалуйста, любезно согласиться с ответом. Это позволяет людям понять, что на запрос был дан ответ, и что они могут тратить свою энергию на помощь другим. –

+0

Спасибо, ребята за импровизированный ответ и извините за то, что вы срочно спросили об этом. Но я забочусь о реакции от опрятного. Было бы здорово, если бы аккуратный бы выбросил ошибку, а не создал недопустимый xml. Очистка содержимого не поможет мне, так как контент может быть слишком тяжелым, и это добавит производительности. Я бы предпочел, чтобы он был очищен в старой базе данных. Вкратце, я хочу опрятно выбросить ошибку, говоря «плохой или грязный контент». Не могли бы вы мне помочь? –

+0

Привет, Рашит, тогда вы полностью пропустите пункт о аккуратности. Первоначально Tidy был создан для автоматического исправления ошибок на html-страницах. Для объяснения см. Https://www.w3.org/People/Raggett/tidy/. Если основной целью является проверка ошибок, вам будет лучше с приличным валидатором. См. Https://validator.w3.org/nu/ – prker

Смежные вопросы