Class: Nokogiri::XML::Attr
- Inherits:
-
NokogiriXmlNode
- Object
- NokogiriXmlNode
- Nokogiri::XML::Attr
- Defined in:
- lib/nokogiri/xml/attr.rb,
ext/nokogiri/xml_attr.c
Class Method Summary collapse
-
.new(document, name) ⇒ Object
Create a new Attr element on the
documentwithname.
Instance Method Summary collapse
-
#deconstruct_keys(keys) ⇒ Object
:call-seq: deconstruct_keys(array_of_names) → Hash.
-
#value=(content) ⇒ Object
(also: #content=)
Set the value for this Attr to
content.
Class Method Details
.new(document, name) ⇒ Object
Create a new Attr element on the document with name
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'ext/nokogiri/xml_attr.c', line 60
static VALUE
noko_xml_attr__new(int argc, VALUE *argv, VALUE klass)
{
xmlDocPtr xml_doc;
VALUE document;
VALUE name;
VALUE rest;
xmlAttrPtr node;
VALUE rb_node;
rb_scan_args(argc, argv, "2*", &document, &name, &rest);
if (! rb_obj_is_kind_of(document, cNokogiriXmlDocument)) {
rb_raise(rb_eArgError, "parameter must be a Nokogiri::XML::Document");
}
xml_doc = noko_xml_document_unwrap(document);
node = xmlNewDocProp(
xml_doc,
(const xmlChar *)StringValueCStr(name),
NULL
);
noko_xml_document_pin_node((xmlNodePtr)node);
rb_node = noko_xml_node_wrap(klass, (xmlNodePtr)node);
rb_obj_call_init(rb_node, argc, argv);
if (rb_block_given_p()) {
rb_yield(rb_node);
}
return rb_node;
}
|
Instance Method Details
#deconstruct_keys(keys) ⇒ Object
:call-seq: deconstruct_keys(array_of_names) → Hash
Returns a hash describing the Attr, to use in pattern matching.
Valid keys and their values:
name→ (String) The name of the attribute.value→ (String) The value of the attribute.namespace→ (Namespace, nil) The Namespace of the attribute, ornilif there is no namespace.
Example
doc = Nokogiri::XML.parse(<<~XML)
<?xml version="1.0"?>
<root xmlns="http://nokogiri.org/ns/default" xmlns:noko="http://nokogiri.org/ns/noko">
<child1 foo="abc" noko:bar="def"/>
</root>
XML
attributes = doc.root.elements.first.attribute_nodes
# => [#(Attr:0x35c { name = "foo", value = "abc" }),
# #(Attr:0x370 {
# name = "bar",
# namespace = #(Namespace:0x384 {
# prefix = "noko",
# href = "http://nokogiri.org/ns/noko"
# }),
# value = "def"
# })]
attributes.first.deconstruct_keys([:name, :value, :namespace])
# => {:name=>"foo", :value=>"abc", :namespace=>nil}
attributes.last.deconstruct_keys([:name, :value, :namespace])
# => {:name=>"bar",
# :value=>"def",
# :namespace=>
# #(Namespace:0x384 {
# prefix = "noko",
# href = "http://nokogiri.org/ns/noko"
# })}
Since v1.14.0
55 56 57 |
# File 'lib/nokogiri/xml/attr.rb', line 55 def deconstruct_keys(keys) { name: name, value: value, namespace: namespace } end |
#value=(content) ⇒ Object Also known as: content=
Set the value for this Attr to content. Use nil to remove the value
(e.g., a HTML boolean attribute).
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'ext/nokogiri/xml_attr.c', line 12
static VALUE
noko_xml_attr_set_value(VALUE self, VALUE content)
{
xmlAttrPtr attr;
Noko_Node_Get_Struct(self, xmlAttr, attr);
{
/* Unlink and pin any wrapped children */
xmlNode *cur = attr->children;
xmlNode *next;
while (cur) {
next = cur->next;
if (cur->_private) {
xmlUnlinkNode(cur);
noko_xml_document_pin_node(cur);
}
cur = next;
}
}
if (content == Qnil) {
xmlNodeSetContent((xmlNodePtr)attr, NULL); /* Clear any remaining unwrapped children. */
} else {
xmlChar *value = xmlEncodeEntitiesReentrant(attr->doc, (unsigned char *)StringValueCStr(content));
if (xmlStrlen(value) == 0) {
xmlNodeSetContent((xmlNodePtr)attr, NULL); /* Clear any remaining unwrapped children. */
/* Preserve empty-string attributes as `foo=""` and not boolean `foo` */
attr->children = attr->last = xmlNewDocText(attr->doc, value);
attr->children->parent = (xmlNode *)attr;
} else {
xmlNodeSetContent((xmlNodePtr)attr, value);
}
xmlFree(value);
}
return content;
}
|