XML

XML作用

・データ

・設定ファイル

C#

DOM

XPath

LINQ to XML

PHP

DOM

XML文書のツリーをメモリーにロードする

XPathをサポートする

SimpleXML

XML文書のツリーをメモリーにロードする

XPathをサポートする

妥当性検証、出力、名前空間を完全にサポートしない

XMLReader / XMLWriter

XPathをサポートしない

速度(一般論)

DomDocument < SimpleXML

Java

速度(一般論)

DOM < JDOM < DOM4j < StAX(iterator) < StAX(cursor) < SAX

DOM(Java)

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class XmlParser5{

public static List<Book> getBookList(String fileName){

return parseDocument(readXml(fileName));

}

private static Document readXml(String fileName){

Document document = null;

try {

DocumentBuilder builder =

DocumentBuilderFactory.newInstance().newDocumentBuilder();

document = builder.parse(new File(fileName));

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return document;

}

private static List<Book> parseDocument(Document document){

List<Book> bookList = new ArrayList<Book>();

Element elements = document.getDocumentElement();

NodeList nodeList = elements.getElementsByTagName("book");

for (int i = 0; i < nodeList.getLength(); i++) {

Element e = (Element) nodeList.item(i);

String title =

e.getElementsByTagName("title").item(0).getFirstChild().getNodeValue();

String author = e.getElementsByTagName("author").item(0).getFirstChild().getNodeValue();

bookList.add(new Book(title, author));

}

return bookList;

}

}

利用側 List<Book> list = XmlParser5.getBookList("D:\\Books.xml");

★XML解析 name取得(<name>xxx</name>)

SAXBuilder builder = new SAXBuilder(false);

Document doc = doc = builder.build(new StringReader(xml));

String name = doc.getRootElement().getChild("name").getText();

★JDomでXML作成(<root><name att="AAA">BBB</name></root>)

Element root = new Element("root");

root.setAttribute("att", attribute);

root.setText(name);

Document doc = new Documet();

doc.setRootElement(root);

XmlOutputter out = new XmlOutputter(Format.getPrettyFormat());

String xml = out.outputString(root);

データ(書き込み用)

// タグ

$data_array = array(

array(

'title' => 'title1', 'content' => 'content1', 'date' => '2012-09-15',

),

array(

'title' => 'title2', 'content' => 'content2', 'date' => '2012-09-16',

)

);

// 属性

$attribute_array = array(

'title' => array( 'size' => 1 )

);

article.xml(読み込み用)

<?xml version="1.0" encoding="UTF-8"?>

<article>

<item>

<title size="1">title1</title>

<content>content1</content>

<date>2012-09-15</date>

</item>

<item>

<title size="1">title2</title>

<content>content2</content>

<date>2012-09-16</date>

</item>

</article>

DOM(PHP)

書き込み

$dom = new DomDocument('1.0', 'utf-8');

// ルート

$article = $dom->createElement('article');

$dom->appendchild($article);

foreach ($data_array as $data) {

$item = $dom->createElement('item');

$article->appendchild($item);

if (is_array($data)) {

foreach ($data as $key => $val) {

// タグを作成

$$key = $dom->createElement($key);

$item->appendchild($$key);

// タグの値を作成

$text = $dom->createTextNode($val);

$$key->appendchild($text);

if (isset($attribute_array[$key])) {

foreach ($attribute_array[$key] as $akey => $row) {

// 属性を作成

$$akey = $dom->createAttribute($akey);

$$key->appendchild($$akey);

// 属性の値を作成

$aval = $dom->createTextNode($row);

$$akey->appendChild($aval);

}

}

}

}

}

echo $dom->saveXML();

//$dom->save('article.xml'); // ファイルに保存

読み込み

$doc = new DOMDocument();

$doc->load('article.xml');

$items = $doc->getElementsByTagName('item');

foreach($items as $item){

$titles = $item->getElementsByTagName('title');

$title = $titles->item(0)->nodeValue;

$contents = $item->getElementsByTagName('content');

$content = $contents->item(0)->nodeValue;

$dates = $item->getElementsByTagName('date');

$date = $dates->item(0)->nodeValue;

echo "$title $content $date<br />";

}

demo.xml

<?xml version="1.0" encoding="utf-8" ?>

<Root>

<Demo>

<Aspect name="">

<Advice type="before" assembly="" className="">

<MethodName>aaa</MethodName>

<MethodName>bbb</MethodName>

</Advice>

...

<Advice type="after" assembly="" className="">

<MethodName>xxx</MethodName>

<MethodName>yyy</MethodName>

</Advice>

</Aspect>

</Demo>

</Root>

StAX(Java)

import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;

import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamException;

import javax.xml.stream.XMLStreamReader;

import javax.xml.transform.stream.StreamSource;

public class XmlParser6{

public static List<Book> getBookList(String fileName){

List<Book> bookList = new ArrayList<Book>();

XMLInputFactory factory = XMLInputFactory.newInstance();

try {

XMLStreamReader reader =

factory.createXMLStreamReader(new StreamSource(new File(fileName)));

reader.nextTag();

reader.nextTag();

while(reader.getEventType() == START_ELEMENT){

bookList.add(new Book(reader));

}

} catch (XMLStreamException e) {

e.printStackTrace();

}

return bookList;

}

}

利用側 List<Book> list = XmlParser6.getBookList("D:\\Books.xml");

import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;

import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement

public class Book{

private String title;

private String author;

public Book() {}

public Book(String title, String author) {

this.title = title;

this.author = author;

}

public Book(XMLStreamReader reader) throws XMLStreamException {

reader.require(START_ELEMENT, null, "book");

reader.nextTag();

reader.require(START_ELEMENT, null, "title");

this.title = reader.getElementText();

reader.nextTag();

reader.require(START_ELEMENT, null, "author");

this.author = reader.getElementText();

reader.nextTag();

reader.require(END_ELEMENT, null, "book");

reader.nextTag();

}

@XmlElement

public String getTitle() {

return title;

}

@XmlElement

public String getAuthor() {

return author;

}

// setter

@Override

public String toString() {

return "Title:" + this.title + " Author:" + this.author;

}

}

SimpleXML(PHP)

書き込み

$string = <<<XML

<?xml version='1.0' encoding='utf-8'?>

<article>

</article>

XML;

$xml = simplexml_load_string($string);

foreach ($data_array as $data) {

$item = $xml->addChild('item');

if (is_array($data)) {

foreach ($data as $key => $row) {

$node = $item->addChild($key, $row);

if (

isset($attribute_array[$key]) &&

is_array($attribute_array[$key])

){

foreach ($attribute_array[$key] as $akey => $aval) {

// 属性を作成

$node->addAttribute($akey, $aval);

}

}

}

}

}

echo $xml->asXML();

読み込み

$xml_array = simplexml_load_file('article.xml');

foreach($xml_array as $data){

echo $data->title . ' ' . $data->content . ' ' . $data->date . '<br />';

}

XMLReader / XMLWriter(PHP)

XMLReader:タグの値よりタグの属性を取得しやすい

書き込み

$xml = new XMLWriter();

$xml->openUri("php://output");

$xml->setIndentString(' ');

$xml->setIndent(true);

$xml->startDocument('1.0', 'utf-8');

// ルート

$xml->startElement('article');

foreach ($data_array as $data) {

$xml->startElement('item');

if (is_array($data)) {

foreach ($data as $key => $row) {

$xml->startElement($key);

if (

isset($attribute_array[$key]) &&

is_array($attribute_array[$key])

){

foreach ($attribute_array[$key] as $akey => $aval) {

// 属性を作成

$xml->writeAttribute($akey, $aval);

}

}

$xml->text($row);

$xml->endElement(); // $key

}

}

$xml->endElement(); // item

}

$xml->endElement(); // article

$xml->endDocument();

$xml->flush();

読み込み

$reader = new XMLReader();

$reader->open('article.xml');

$i = 1;

while ( $reader->read() ) {

if ($reader->nodeType == XMLReader::TEXT) {

if($i % 3){

echo $reader->value . ' ';

}else{

echo $reader->value . '<br />' ;

}

$i++;

}

}

XPath(C#)

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(@"d:\demo.xml");

XmlNodeList nodeList =

xmlDoc.SelectNodes("Root/Demo/Aspect/Advice[@type='before']/MethodName");

foreach (XmlNode node in nodeList)

{

Console.WriteLine(node.InnerText);

}

LINQ to XML(C#)

var xmlDoc = XDocument.Load(@"d:\demo.xml");

var datas = from k in

(from m in xmlDoc.Descendants("Advice")

where m.Attribute("type").Value == "before"

select m).Descendants("MethodName")

select k.Value;

foreach (var data in datas)

{

Console.WriteLine(data);

}