2015-05-18 10 views
0

Я использую Nokogiri для генерации XML. Я хотел бы добавить префикс пространства имен только к корневому узлу XML, но проблема заключается в применении префикса к первому элементу, который он получает, применительно ко всем дочерним элементам.Добавить префикс в корневой узел XML

Это мой ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
<req:Request xmlns:req="http://www.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.0"> 
<LanguageCode>en</LanguageCode> 
<Enabled>Y</Enabled> 
</req:Request> 
+2

Могли бы вы вставить фрагмент кода, создающего XML? также вы можете проверить этот документ: http://www.rubydoc.info/github/sparklemotion/nokogiri/master/Nokogiri/XML/Builder – flafoux

+1

Добро пожаловать в Stack Overflow. Вы просите нас отлаживать код, который мы не видим. Это не сработает. Вы должны показать нам минимальный пример кода, который вы написали, объяснить, почему вы думаете, что он не работает, и тогда мы можем вам помочь. В противном случае, похоже, вы просите нас написать код для вас. –

ответ

2

Попробуйте добавить атрибут xmlns="", который, кажется, намекает на XML строитель, что элементы должны быть в пространстве имен по умолчанию, если otherwse не объявлен. Я считаю, результирующий документ семантически эквивалентно вашему примеру, несмотря на наличие ...

attrs = { 
    'xmlns' => '', 
    'xmlns:req' => 'http://www.google.com', 
    'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 
    'schemaVersion' => '1.0', 
} 
builder = Nokogiri::XML::Builder.new do |xml| 
    xml['req'].Request(attrs) { 
    xml.LanguageCode('en') 
    xml.Enabled('Y') 
    } 
end 

builder.to_xml # => 
# <?xml version="1.0"?> 
# <req:Request xmlns="" xmlns:req="http://www.google.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.0"> 
# <LanguageCode>en</LanguageCode> 
# <Enabled>Y</Enabled> 
# </req:Request> 
+0

Я думаю, вам нужно '' xmlns '=>' ''(т. Е. Пустая строка, а не строка' default'). [Spec says] (http://www.w3.org/TR/REC-xml-names/#defaulting) «Значение атрибута в объявлении пространства имен по умолчанию _MAY_ будет пустым. Это имеет тот же эффект в рамках декларации, что не существует пространства имен по умолчанию ». Использование' default' будет помещать все незафиксированные элементы в пространство имен с именем 'default', а не пространство имен. – matt

+0

@matt: хм, имеет смысл. Я обновил ответ. – maerics

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