Если вы хотите извлечь содержимое узла Element
, используйте метод getTextContent()
. Если вам действительно нужна или нужна разметка раздела CDATA, вам потребуется сериализовать этот узел с помощью LSSerializer
или аналогичного:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File("doc1.xml"));
Element content = (Element)doc.getElementsByTagNameNS("http://comResponse.engine/response", "content").item(0);
if (content != null)
{
System.out.println(content.getTextContent());
LSSerializer ser = ((DOMImplementationLS)doc.getImplementation()).createLSSerializer();
if (content.getFirstChild() != null)
{
System.out.println(ser.writeToString(content.getFirstChild()));
}
}
. Это теория, для меня выходы Java JRE 1.8 <![CDATA[<explanation></explanation>
без закрывающая разметка для секции CDATA, похоже, что LSSerializer
работает некорректно с одним узлом секции CDATA.
Лучшее, которое я придумал до сих пор, является чем-то вроде этого:
<%= f.text_field :my_attribute, :value => number_with_precision(f.object.my_attribute) %>
Или my_attribute
мог возвратить отформатированное значение, как это:
def my_attribute
ApplicationController.helpers.number_with_precision(read_attribute(:my_attribute))
end
, Но все еще необходимо использовать :value
<%= f.text_field :my_attribute, :value => f.object.my_attribute %>
, Это походит на большую работу.
Я предпочитаю Ваш первый ответ, при этом форматирование сделано в представлении. Однако, если Вы хотите выполнить форматирование в модели, можно использовать методы обертки для метода get и метода set, и избежать необходимости использовать: опция значения полностью.
Вы закончили бы с чем-то вроде этого.
def my_attribute_string
foo_formatter(myattribute)
end
def my_attribute_string=(s)
# Parse "s" or do whatever you need to with it, then set your real attribute.
end
<%= f.text_field :my_attribute_string %>
Railscasts покрыл это объектом Времени в text_field в эпизод № 32 . Действительно умная часть этого - то, как они обрабатывают ошибки проверки. Стоит наблюдать эпизод за этим одним.
Если Вы захотите, чтобы формат создавался или сохранялся во время редактирования, то необходимо будет добавить JavaScript для реализации "масок". Вот демонстрация.
Это был первый хит в эти результаты .
Можно использовать плагин number_format. Путем определения number_format
для существующего числового атрибута в модели, атрибут теперь появится, как отформатировано к направляющим во всех формах и представлениях. Это будет также проанализировано назад от того формата (при присвоении через формы) до вставки в базу данных. (Плагин также создает чисто числовой unformatted_<attribute-name>
средства доступа, которые могут продолжить использоваться для арифметики, или для прямого числового присвоения или извлечения Вами для бесшовной интеграции.)
class MyModel < ActiveRecord::Base
# this model has the balance attribute, which we
# want to display using formatting in views,
# although it is stored as a numeric in the database
number_format :balance,
:precision => 2,
:delimiter => ',',
:strip_trailing_zeros => false
def increment_balance
unformatted_balance += 10
end
можно также объединить вышеупомянутое с решением JavaScript, которое может вынудить пользователя поддержать десятичную точку и тысячи разделителей на месте при редактировании, хотя это действительно не необходимо.
Я сделал что-то подобное. Мы форматируем времена и длины с помощью пользовательского конструктора форм. Это использует существующий text_field, но обертывает его так, значение может быть настроено:
class SuperFormBuilder < ActionView::Helpers::FormBuilder
include ApplicationHelper
include FormHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::FormTagHelper
def length_field(label,*args)
scale = 'medium'
args.each do |v|
if v.has_key?(:scale)
scale = v[:scale]
v.delete(:scale)
end
end
value = length_conversion(@object.send(label.to_sym),scale)
options = (args.length > 0) ? args.pop : {}
return has_error(label, text_field_tag(field_name(label),value,*args) + ' ' + length_unit(scale))
end
private
def field_name(label)
return @object_name + "[#{label}]"
end
def has_error(label, output)
return "<div class='fieldWithErrors'>#{output}</div>" if @object.errors[label]
return output
end
И это используется как это:
<%= form_for( @section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
конечным результатом является значение в соответствующей единице, базирующейся от их выбора на системе (Метрика, империал) и IE масштаба, маленький = дюймы или миллиметры.
я в основном скопировал text_field метод с существующего конструктора форм, который использует сам text_field_tag.
существует два глюка: 1) Знание названия поля объекта и как получить доступ к объекту получить значение, которое Вы хотите отформатировать. 2) Разбирание в имени поэтому, когда форма отправлена, это - часть корректного хеша параметрических усилителей.
конструктору форм дают переменную класса @object. Можно получить значение поля с помощью .send метода. В моем случае я отправляю маркировку: feed_size_min_w к @object и возвращают его длину. Я тогда преобразовываю его в свой нужный формат и даю его text_field_tag.
название поля является ключевым для наличия, оно заканчивается в хеше параметрических усилителей в моем экземпляре параметрические усилители [: разделы] один. Я сделал немного функции помощника названным field_name, который заботится об этом.
Наконец has_error обертывает поле в ошибочное отделение, если существуют ошибки на той маркировке.