Как использовать XmlSimple для создания XML-элемента с атрибутом и текстовым узлом? - PullRequest
2 голосов
/ 03 апреля 2012

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

Проблема

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

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

Вот что я сейчас получаю:

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

Я пытался использовать опцию «ContentKey» => «content» для 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"})

Подробности среды

  • ОС: Windows 7
  • Рубин: 1.9.3-p125
  • XmlSimple: 1.0.13

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

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

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Приятной особенностью 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>

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

2 голосов
/ 03 апреля 2012

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

=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.

...