Mary Miller 64500
Jim J. Jones Jr 42000
<employee> <name>Mary Miller</name> <salary>64500</salary> </employee> <employee> <name>Jim J. Jones Jr</name> <salary>42000</salary> </employee>
Mary Miller 64500 1982
<employee> <name>Mary Miller</name> <salary>64500</salary> <year>1982</year> </employee>
XML is Stricter Than HTML
<img src="hamster.jpeg"/>
<?xml version="1.0"?>
<?xml version="1.0"?> <staff> more data </staff>
<elementTag optional attributes> content </elementTag>
<img src="hamster.jpeg"/>
DOMImplementation* implementation
= DOMImplementation::getImplementation();
DOMBuilder* parser = implementation->createDOMBuilder(
DOMImplementation::MODE_SYNCHRONOUS, NULL);
DOMDocument* doc = parser->parseURI("items.xml");
DOMNode* root = doc->getDocumentElement();
<?xml version="1.0"?>
<items>
<item>
<product>
<description>Ink Jet Refill Kit</description>
<price>29.95</price>
</product>
<quantity>8</quantity>
</item>
<item>
<product>
<description>4-port Mini Hub</description>
<price>19.95</price>
</product>
<quantity>4</quantity>
</item>
</items>
DOMNodeList* nodes = root->getChildNodes();
int i = . . .;
// A # between 0 and nodes->getLength() - 1
DOMNode* child_node = nodes->item(i);
for (int i = 0; i < nodes->getLength(); i++)
{
DOMNode* child_node = nodes->item(i);
DOMElement* child_element
= dynamic_cast<DOMElement*>(child_node);
if (child_element != NULL)
{
// Do something with child_element
. . .
}
}
DOMElement* price_element = . . .;
XMLCh* name = price_element->getTagName();
// Returns a tag name, such as price
string XMLCh_to_string(const XMLCh* in)
{
char* s = XMLString::transcode(in);
string r(s);
XMLString::release(&s);
return r;
}
string get_attribute(DOMElement* element, string name)
{
XMLCh* xname = new XMLCh[name.length() + 1];
XMLString::transcode(name.c_str(),
xname, name.length());
XMLCh* xvalue = element->getAttribute(xname);
delete xname;
return XMLCh_to_string(xvalue);
}
string attribute_value = get_attribute(
price_element, "currency");
DOMNamedNodeMap* attributes = price_element->getAttributes();
int i = . . .;
// # between 0 and attributes->getLength() - 1
DOMNode* attribute_node = attributes->item(i);
XMLCh* attribute_name = attribute_node->getNodeName();
// For example, "currency"
XMLCh* attribute_value = attribute_node.getNodeValue();
// For example, "USD"
DOMNode* price_element = . . .;
DOMText* price_data =dynamic_cast<DOMText*> (
price_element->getFirstChild());
string price_string = XMLCh_to_string(price_data->getData());
// For example, "24.95"
double price = string_to_double(price_string);
// For example, 24.95
Helper Functions in an XML Parser
ClassForElement getElementName(DOMNode* e)
{
DOMNodeList* children = e->getChildNodes();
for (int i = 0; i < children->getLength(); i++)
{
DOMNode* child_node = children->item(i);
DOMElement* child_element
= dynamic_cast<DOMElement*>(child_node);
if (child_element != NULL)
{
Get value of child element
}
}
Use the child element values to construct and
return a ClassForElement object
}
DOMText* text_node = dynamic_cast<DOMText*>( child_element->getFirstChild()); string data = XMLCh_to_string(text_node->getData());
DOMImplementation* implementation
= DOMImplementation::getImplementation();
DOMDocument* doc = implementation->createDocument();
doc->setStandalone(true);
// An empty document
DOMElement* create_element(DOMDocument* doc, string name)
{
XMLCh* xname = new XMLCh[name.length() + 1];
XMLString::transcode(name.c_str(), xname, name.length());
DOMElement* r = doc->createElement(xname);
delete xname;
return r;
}
DOMElement* create_text_element(DOMDocument* doc,
string name, string text)
{
XMLCh* xtext = new XMLCh[text.length() + 1];
XMLString::transcode(text.c_str(), xtext, text.length());
DOMText* textNode = doc->createTextNode(xtext);
delete xtext;
DOMElement* r = create_element(doc, name);
r->appendChild(textNode);
return r;
}
XMLCh xname = . . .;
XMLCh xvalue = . . .;
price_element->setAttribute(xname, xvalue);
DOMElement* itemElement = create_element(doc, "item"); DOMElement* product_element = create_element(doc, "product"); DOMElement* description_element = create_text_element(doc, "description", "Ink Jet Refill Kit"); DOMElement* price_element = create_text_element(doc, "price", "29.95"); DOMElement* quantity_element = create_text_element(doc, "quantity", "8");
doc->appendChild(item_element); item_element->appendChild(product_element); item_element->appendChild(quantity_element); product_element->appendChild(description_element); product_element->appendChild(price_element);
DOMElement* create_product(DOMDocument* doc, const Product& p) DOMElement* create_item(DOMDocument* doc, const Item& anItem) DOMElement* create_item_list(DOMDocument* doc, const vector<Item>& items)
DOMWriter* writer = implementation->createDOMWriter();
writer->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
XMLFormatTarget* out = new StdOutFormatTarget();
writer->writeNode(out, *doc);
XMLCh* filename = . . .; XMLFormatTarget* out = new LocalFileFormatTarget(filename); writer->writeNode(out, *doc);
<!ELEMENT items (item*)>items must contain 0 or more item elements
<!ELEMENT item (product, quantity)>
<!ELEMENT product (description, price)>
<!ELEMENT quantity (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT price (#PCDATA)>
| Character | Encoding | Name |
|---|---|---|
| < | < | Less than (left angle bracket) |
| > | > | Greater than (right angle bracket) |
| & | & | Ampersand |
| ' | ' | Apostrophe |
| " | " | Quotation mark |
| Rule Description | Element Content |
|---|---|
| EMPTY | No children allowed |
| (E*) | Any sequence of 0 or more elements E |
| (E+) | Any sequence of 1 or more elements E |
| (E?) | Optional element E (0 or 1) |
| (E1, E2, . . .) | Element E1, followed by E2, ... |
| (E1|E2|. . .) | Element E1 or E2 or ... |
| (#PCDATA) | Text only (parsable) |
| (#PCDATA|E1|E2|. . .)* | Any sequence of text and elements E1, E2, ..., in any order |
| ANY | Any children allowed |
<!ELEMENT section (title, (paragraph | (image, title?))+)>
<!ATTLIST Element Attribute Type Default>
| Type Description | Attribute Type |
|---|---|
| CDATA | Any character data |
| (N1|N2|. . .) | One of N1, N2, ... |
<!ATTLIST price currency (USD | EUR | JPY) #REQUIRED>
| Default Declaration | Explanation |
|---|---|
| #REQUIRED | Attribute is required |
| #IMPLIED | Attribute is optional |
| N | Default attribute, used if attribute not specified |
| #FIXED N | Attribute must either be unspecified or contain this value |
<!ATTLIST price currency CDATA #IMPLIED>Some default currency implicitly assumed
<!ATTLIST price currency CDATA "USD">
The XML Schema Specification
<xsd:element name="quantity" type="xsd:integer"/>
| XML Schema Type | Meaning |
|---|---|
| string | Any string |
| integer | An integer |
| double | A floating-point number |
| boolean | False or True |
| date | E.g., 2001-01-04 |
| time | E.g., 05:43 |
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="company" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="shipto" type="Address"/>
<xsd:element name="billto" type="Address"/>
<!DOCTYPE rootElement [rules]>
<!DOCTYPE items SYSTEM "items.dtd">
<!DOCTYPE items
SYSTEM "http://www.mycompany.com/dtds/items.dtd">
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
parser->setFeature(XMLUni::fgDOMValidation, true);
bool handleError(const DOMError& domError)
DOMErrorHandler* handler = new SimpleErrorHandler();
parser->setErrorHandler(handler);
parser->setFeature(XMLUni::fgDOMWhitespaceInElementContent, false);
XMLCh* attribute_value
= price_element->getAttribute("currency");
// Gets "USD" if no currency specified