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);
}