2012-04-03 1 views
2

У меня проблема, которая звучит принципиально, но я нигде не нашел решения. Я использую Ruby-версию XmlSimple, в частности функцию xml_out.Как использовать XmlSimple для создания элемента XML с атрибутом и текстовым узлом?

Проблема

У меня возникли проблемы вывод элемента, который будет иметь один узел атрибута и текстовый узел. Вот что я хочу:

<lane id='1'>unchannelized</lane> 

Вот что я в настоящее время получаю:

<lane id='1'> 
    <content>unchannelized</content> 
</lane> 

Я пытался использовать «ContentKey» вариант => «содержание» в xml_out (в дополнение к " AttrPrefix "=> true), но это дало тот же результат. Я попытался также изменить ContentKey, такую ​​же разницу.

Соответствующий код

Текстовый узел атрибута & добавляться в массив:

laneConfigArr << {"@id" => laneNo, "content" => netsimLaneChannelizationCode(matchArr[matchIndex])} 

Фактический хэш генерируется:

unhappyHash << { 
    #more stuff here, 
    "LaneConfig" => {"lane" => laneConfigArr}, 
    #more stuff here 
} 

xml_out вызова [Изменено]:

result["NetsimLinks"] = {"NetsimLink" => unhappyHash} 
doc = XmlSimple.xml_out(result, {"AttrPrefix" => true, "RootName" => "CORSIMNetwork", "ContentKey" => "content"}) 

Подробности Environment

  • ОС: Windows 7
  • Ruby: 1.9.3-P125
  • XmlSimple: 1.0.13

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

Я был бы очень признателен за любую помощь в этом.

+0

Зачем вы передаете результат REXML? –

+0

Хорошо, потому что в XmlSimple ссылке они добавляют пробел в документ REXML, прежде чем записывать его в файл. Меня это не волнует, поэтому я могу обойти его. Это не имеет отношения к проблеме. Если я этого не сделаю, то получаю тот же результат. –

ответ

3

Хорошая вещь о XmlSimple заключается в том, что она круглая: вы можете поставить желаемый результат через xml_in, и он даст вам то, что вам нужно, чтобы произвести его с помощью xml_out.

Так что давайте посмотрим. Скажем, у нас есть следующий упрощенный XML:

require 'xmlsimple' 

xml = %Q(
    <CORSIMNetwork> 
    <lane id='1'>unchannelized</lane> 
    </CORSIMNetwork> 
) 

Теперь давайте посмотрим, что мы получаем в результате XmlSimple.xml_in(xml):

{"lane"=>[{"id"=>"1", "content"=>"unchannelized"}]} 

Корень нет, потому что мы не указали опцию KeepRoot, но иначе это то, что мы ожидаем.

Теперь давайте делать xml_out на нем указав опцию RootName, чтобы получить корень обратно:

<CORSIMNetwork> 
    <lane id="1">unchannelized</lane> 
</CORSIMNetwork> 

Выглядит ОК. Я проверил параметр AttrPrefix и, кроме того, что вместо "@id" вместо "id" введите ключ на входе, выход остается тем же.

Полный скрипт, который производит правильный вывод:

require 'xmlsimple' 

lane_config = [{ "@id" => 1, "content" => "unchannelized"}] 
unhappy = { 
    "LaneConfig" => {"lane" => lane_config}, 
} 

doc = XmlSimple.xml_out(unhappy, {"AttrPrefix" => true, 
            "RootName" => "CORSIMNetwork", 
            "ContentKey" => "content" 
       }) 
puts doc 

Выход:

<CORSIMNetwork> 
    <LaneConfig> 
    <lane id="1">unchannelized</lane> 
    </LaneConfig> 
</CORSIMNetwork> 

Поскольку выше работ для меня, единственное, что я могу думать о том, что ваш хэш не должен содержать то, что вы думаю, содержит.

+0

Ваш код выше (точно) для меня возвращает: неструктурированный

+0

Странно, ваш 'ContentKey', кажется, не быть обработаны с помощью' AttrPrefix' , Но вам не нужен AttrPrefix с 'id', как я показал выше, и вы обнаружили. –

+0

My XmlSimple - 1.1.1. Возможно, был выпущен исправление ошибок? Попробуйте обновить. –

2

вот некоторые примеры, которые могут помочь вам

=begin 
    <lane id="1"> 
     bolt,usain 
    </lane> 
=end 

data = {'id' => 1,'content' => 'bolt,usain'} 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      bolt, usain 
     </runner> 
    </lane> 
=end 

data = {'id' => 1, 'runner' => [{'num' => 1, 'content' => 'bolt,usain'}]} 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      bolt,usain 
     </runner> 
     <country code="165"> 
      jamaica 
     </country> 
    </lane> 
=end 

data = {'id' => 1, 
     'runner' => [{'num' => 1, 'content' => 'bolt, usain'}], 
     'country' => [{'code' => 165, 'content' => 'jamaica'}] 
     } 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      <surname>bolt</surname> 
      <name>usain</name) 
     </runner> 
     <country code="165"> 
      jamaica 
     </country> 
    </lane> 
=end 

data = {'id' => 1, 
     'runner' => [{'num' => 1, 'surname' => ["bolt"], 'name' => ["usain"]}], 
     'country' => [{'code' => 165, 'content' => 'jamaica'}] 
     } 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

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

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