Nokogiri неправильно анализирует XML-строку - PullRequest
0 голосов
/ 05 февраля 2019

РЕДАКТИРОВАТЬ: xml анализируется с помощью команды curl.Он не инициализируется, как в примере, у меня есть строка XML

xml = <?xml version=1.0 encoding=UTF-8 standalone=yes?>
      <Document xmlns=somexmlns>
            <tag> some data </tag>
     </Document>

Когда я пытаюсь выполнить синтаксический анализ с Nokogiri, (я пробовал все 3)
Nokogiri::XML(xml)
Nokogiri::XML.parse(xml) Nokogiri::XML.parse(xml).remove_namespaces!
Я получаю

<?xml version="1.0"?>
<Document/>

Я знаю, что могу удалить тег xmlnx перед его синтаксическим анализом с помощью Nokogiri, но я хотел бы знать, почему это происходит, и как я могу разрешить его без изменения XMLсам по себе.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Это все о кавычках.Почему бы вам не использовать их?

К сожалению, цитата из стандарта вставлена ​​неправильно (из-за кавычек), поэтому я записал ее в виде кода.

# To allow attribute values to contain both single and double quotes, the apostrophe or single-quote character (') may be represented as " &apos; ", and the double-quote character (") as " &quot; ".

Посмотрите:

xml = <<-BADXML
<?xml version=1.0 encoding=UTF-8 standalone=yes?>
<Document xmlns=somexmlns>
<tag> some data </tag>
</Document>
BADXML

doc = Nokogiri::XML(xml)
puts doc

# <?xml version="1.0"?>
# <Document/>
xml = <<-GOODXML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Document xmlns="somexmlns">
<tag> some data </tag>
</Document>
GOODXML

doc = Nokogiri::XML(xml)
puts doc

# <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
# <Document xmlns="somexmlns">
# <tag> some data </tag>
# </Document>

Также лучше использовать строчные буквы, такие как <document></document>

0 голосов
/ 05 февраля 2019

Оказывается, я забыл установить тип данных как text/xml в curl.

0 голосов
/ 05 февраля 2019

Работает:

doc = Nokogiri::XML ('<?xml version="1.0" encoding="UTF-8"?><document xmlns="somexmlns"><tag> some data </tag></document>')
 => #<Nokogiri::XML::Document:0x3fda1d0c9dd8 name="document" children=[#<Nokogiri::XML::Element:0x3fda1d0c9b1c name="document" namespace=#<Nokogiri::XML::Namespace:0x3fda1d0c9acc href="somexmlns"> children=[#<Nokogiri::XML::Element:0x3fda1d0c9770 name="tag" namespace=#<Nokogiri::XML::Namespace:0x3fda1d0c9acc href="somexmlns"> children=[#<Nokogiri::XML::Text:0x3fda1d0c93ec " some data ">]>]>]> 

doc.children.text
 => " some data " 
...