加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML相关

发布时间:2020-12-16 00:40:54 所属栏目:百科 来源:网络整理
导读:大学时的笔记,整理一下,有关XML及相关操作的。 Axml实体引用 amp; ' apos; gt; lt; " quot; B dom技术 1.访问相关节点 html head titleDOM Example/title /head body pHello World!/p pIsn't this exciting!/p pYou're learning to use the DOM!/p /body/h

大学时的笔记,整理一下,有关XML及相关操作的。

Axml实体引用

& &
    '    '
    > >
   <   &lt;
    "   &quot;
B dom技术

1.访问相关节点

<html>
  <head>
    <title>DOM Example</title>
  </head>
  <body>
    <p>Hello World!</p>
    <p>Isn't this exciting!</p>
    <p>You're learning to use the DOM!</p>
  </body>
</html>

访问<html/>元素:

var oHtml = document.documentElement;

取得<head/>元素:

var oHead = oHtml.firstChild; /
var oHead = oHtml.childNodes[0]; /
var oHead = oHtml.childNodes.item(0);

取得<body/>元素:

var oBody = document.body;
var oBody = oHtml.lastChild; / 
var oBody = oHtml.childNodes[1]; /
var oBody = oHtml.childNodes.item(1);

取得子节点数量:

var length = oHead.childNodes.length;

确定<html/> <head/> <body/>之间的关系:

alert(oHead.parentNode == oHtml);       //outputs "true"
alert(oBody.parentNode == oHtml);       //outputs "true"
alert(oHead.nextSubling == oBody);      //outputs "true"
alert(oBody.previousSubling == oHead);  //outputs "true"
alert(oHead.ownerDocument == document); //outputs "true"

2.处理特性

<p style="color:red" id="p1">Hello world!</p>

获取id特性值:

var oP = document.getElementById("p1");
var sId = oP.getAttribute("id"); 或
var sId = oP.attributes.getNamedItem("id").nodeValue; 或
var sId = oP.attributes.item(1).nodeValue;

设置id特性值:

var oP = document.getElementById("p1");
oP.setAttribute("id") = "newId";
oP.attributes.getNamedItem("id").nodeValue = "newId";
oP.attributes.item(1).nodeValue = "newId";

3.访问指定节点

3.1)XML DOM的getElementByTagName();

获取文档中第3个img元素:

var oImgs = document.getElementByTagName("img");

var oneImg = oImgs[2];或

var oneImg = oImgs.item(2);

获取页面第一段落的所有图像:

var oP = document.getElementByTagName("p").item(0);

var oImgs = oP.getElementByTagName("img");

3.2)HTML DOM的getElementByName();

<html>
  <head>DOM Example</head>
  <body>
    <form method="post" action="dosomething.cgi">
      <fieldset>
        <legend>What color do you like?</legend>
        <input type="radio" name="radColor" value="red"/>Red<br/>
        <input type="radio" name="radColor" value="Green"/>Green<br/>
        <input type="radio" name="radColor" value="Blue"/>Blue<br/>
      </fieldset>
    </form>
  </body>
</html>

获得所有单选按钮的引用:var oRadios = document.getElementByName("radColor");

获得单个单选按钮的颜色:alert(oRadios[0].getArrribute("value")); //outputs "Red"

3.3)HTML DOM的getElementById()

<html>
  <head>DOM Example</head>
  <body>
    <p>Hello World!</p>
    <div id="div1">This is my first layer</div>
  </body>
</html>

访问id为"div1"的</div>元素:

HTML DOM

var oDiv1 = document.getElementById("div1"); /

XML DOM

var oDivs = document.getElementByTagName("div");
var oDiv1 = null;
for(int i=0; i<oDivs.length; i++){
    if(oDivs[i].getAttribute("id") == "div1"){
        oDiv1 = oDivs[i];
        break; 
    }
}

4创建和操作节点

假设有如下页面:

<html>
  <head>
    <title>createElement() Example</title>
  </head>
  <body>
  </body>
</html>

4.1)createElement()、createTextNode()、appendChild()

使用DOM添加<p>Hello World!</p>到这个页面中:

<html>
  <head>
    <title>createElement() Example</title>
    <script type="text/javascript">
        function createMessage(){
            var oP = document.createElement("p");
            var oText = document.createTextNode("Hello World!");
            oP.appendChild(oText);
            document.body.appendChild(oP);
        }
    </script>
  </head>
  <body onload="createMessage()">
  </body>
</html>

4.2)removeChild()

假设已有一个包含Hello World!消息的页面.

移除消息:

<html>
  <head>
    <title>removeChild() Example</title>
    <script type="text/javascript">
        function removeMessage(){
            var oPs = document.getElementByTagName("p");
            var oP = oPs[0];
            oP.parentNode.removeChild(oP)
        }
    </script>
  </head>
  <body onload="removeMessage()">
    <p>Hello World!</p>
  </body>
</html>

4.3)replaceChild()

假设已有一个包含Hello World!消息的页面.

用<p>Hello Universe!</p>替换消息:

<html>
  <head>
    <title>replaceChild() Example</title>
    <script type="text/javascript">
        function replaceMessage(){
            var oNewP = document.createElement("p");
            var oText = document.createTextNode("Hello Universe!");
            oNewP.appendChild(oText);
            var oOldP = document.getElementByTagName("p")[0];
            oOldP.parentNode.replaceChild(oNewP,oOldP);
        }
    </script>
  </head>
  <body onload="replaceMessage()">
    <p>Hello World!</p>
  </body>
</html>

4.4)insertBefore()

假设已有一个包含Hello World!消息的页面.

让<p>Hello Universe!</p>出现在此消息之前:

<html>
  <head>
    <title>insertBefore() Example</title>
    <script type="text/javascript">
        function insertMessage(){
            var oNewP = document.createElement("p");
            var oText = document.createTextNode("Hello Universe!");
            oNewP.appendChild(oText);
            var oOldP = document.getElementByTagName("p")[0];
            oOldP.parentNode.insertBefore(oNewP,oOldP);
        }
    </script>
  </head>
  <body onload="replaceMessage()">
    <p>Hello World!</p>
  </body>
</html>

4.5)createDocumentFragment()

一次刷屏代替多次刷屏

var arrText = ["first","second","third","fourth","fifth"];
var oFragment = document.createDocumentFragment();
for(var i=0;i<arrText.length;i++){
  var oP = document.createElement("p");
  var oText = document.createTextNode(arrText[i]);
  oP.appendChild(oText);
  oFragment.appendChild(oP);
}
document.body.appendChild(oFragment.appendChild(oFragment));

这里对appendChild()的调用实际上并不是把文档碎片节点本身追加到</body>元素中;而是仅仅追加碎片中的子节点。

调用document.body.appendChild()一次代替十次,这意味着只需要进行一次刷屏.

5 HTML DOM特征功能

5.1)让特性像属性一样

<img src="mypicture.jpg" border="0"/>

使用XML DOM获取和设置src和border特性,要用getAttribute()和setAttribute()方法:

alert(oImg.getAttribute("src"));

alert(oImg.getAttribute("border"));

oImg.setAttribute("src","mypicture2.jsp")

oImg.setAttribute("border","1");

使用HTML DOM,可以使用同样名称的属性来获取和设置这些值:

alert(oImg.src);

alert(oImg.border);

oImg.src="mypicture2.jsp";

oImg.border="1";

特性名和属性名不一样的特例:(因为class是个保留字)

<div class="header"></div>
alert(oDiv.className);
oDiv.className="footer";

注:IE在setAttribute()上有个很大的问题,当你使用它时,变更并不会总是正确地反应出来。如果使用IE,最好尽可能用属性

5.2)table方法

假设想使用DOM来创建如下HTML表格:

<table border="1" width="100%">
  <tbody>
    <tr>
      <td>Cell 1,1</td>
      <td>Cell 1,2</td>
    </tr>
    <tr>
      <td>Cell 2,1</td>
      <td>Cell 2,2</td>
    </tr>
  </tbody>
</table>

通过XML DOM完成:

//create the table
var oTable = document.createElement("table");
oTable.setAttribute("border","1");
oTable.setAttribute("width","100%");
//create the tbody
var oTBody = document.createElement("tbody");
oTable.appendChild(oTBody);
//create the first row
var oTR1 = document.createElement("tr");
oTBody.appendChild(oTR1);
var oTD11 = document.createElement("td");
oTD11.appendChild(document.createTextNode("Cell 1,1"));
oTR1.appendChild(oTD11);
var oTD12 = document.createElement("td");
oTD12.appendChild(document.createTextNode("Cell 1,2"));
oTR1.appendChild(oTD12);
//create the second row
var oTR2 = document.createElement("tr");
oTBody.appendChild(oTR2);
var oTD21 = document.createElement("td");
oTD21.appendChild(document.createTextNode("Cell 2,1"));
oTR2.appendChild(oTD21);
var oTD22 = document.createElement("td");
oTD22.appendChild(document.createTextNode("Cell 2,2"));
oTR2.appendChild(oTD22);
//add the table to the document body
document.body.appendChild(oTable);

这段代码十分冗长且有些难以理解。

为了协助建立表格,HTML DOM给<table/>、<tbody/>和</tr>添加了一些特性和方法

通过HTML DOM完成:

//create the table
var oTable = document.createElement("table");
oTable.border = "1";
oTable..width = "100%";
//create the body
var oTBdoy = document.createElement("tbody");
oTable.appendChild(oTBody);
//create the first row
oTBody.inserRow(0);
oTBody.rows[0].inserCell(0);
oTBody.rows[0].cells[0].appendChild(document.createTextNode("Cell 1,1"));
oTBody.rows[0].inserCell(1);
oTBody.rows[0].cells[1].appendChild(document.createTextNode("Cell 1,2"));
//create the second row
oTBody.inserRow(1);
oTBody.rows[1].inserCell(0);
oTBody.rows[1].cells[0].appendChild(document.createTextNode("Cell 2,1"));
oTBody.rows[1].inserCell(1);
oTBody.rows[1].cells[1].appendChild(document.createTextNode("Cell 2,2"));
//add the table to the document body
document.body.appendChild(oTable);


虽然从技术角度来说,两种代码都是正确的,

但是使用这些特性和方法来创建表格使得代码变得更加有逻辑且更加易读

参考文档: http://www.iteye.com/topic/335626


C dom4J的使用

  • dom4j它的主要接口都在org.dom4j这个包里定义:

    Attribute

    Attribute定义了XML的属性

    Branch

    Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,

    CDATA

    CDATA 定义了XML CDATA 区域

    CharacterData

    CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment,Text.

    Comment

    Comment 定义了XML注释的行为

    Document

    定义了XML文档

    DocumentType

    DocumentType 定义XML DOCTYPE声明

    Element

    Element定义XML 元素

    ElementHandler

    ElementHandler定义了 Element 对象的处理器

    ElementPath

    被ElementHandler使用,用于取得当前正在处理的路径层次信息

    Entity

    Entity定义 XML entity

    Node

    Node为所有的dom4j中XML节点定义了多态行为

    NodeFilter

    NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)

    ProcessingInstruction

    ProcessingInstruction 定义 XML 处理指令.

    Text

    Text 定义XML 文本节点.

    Visitor

    Visitor 用于实现Visitor模式.

    XPath

    XPath 在分析一个字符串后会提供一个XPath 表达式

1读取并解析XML文档
// 从文件读取XML,输入文件名,返回XML文档
    public Document read(String fileName) throws MalformedURLException,DocumentException {
       SAXReader reader = new SAXReader();
       Document document = reader.read(new File(fileName));
       return document;
    }
2 取得 Root 节点

public Element getRootElement(Document doc){
       return doc.getRootElement();
    }
3 遍历 XML

1) 枚举(Iterator)
 
    // 枚举所有子节点
    for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
       Element element = (Element) i.next();
       // do something
    }
    // 枚举名称为foo的节点
    for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
       Element foo = (Element) i.next();
       // do something
    }
    // 枚举属性
    for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
       Attribute attribute = (Attribute) i.next();
       // do something
    }
2)递归
 
    public void treeWalk() {
       treeWalk(getRootElement());
    }
    public void treeWalk(Element element) {
       for (int i = 0,size = element.nodeCount(); i < size; i++)     {
           Node node = element.node(i);
           if (node instanceof Element) {
              treeWalk((Element) node);
           } else { // do something....
           }
       }
}
3) Visitor模式
 
       public class MyVisitor extends VisitorSupport {
           public void visit(Element element){
               System.out.println(element.getName());
           }
           public void visit(Attribute attr){
               System.out.println(attr.getName());
           }
        }
root.accept(new MyVisitor())

4. XPath支持

DOM4JXPath有良好的支持,如访问一个节点,可直接用XPath选择。

public void bar(Document document) {
        List list = document.selectNodes( //foo/bar );
        Node node = document.selectSingleNode(//foo/bar/author);
        String name = node.valueOf( @name );
     }
 
    例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:
 
    public void findLinks(Document document) throws DocumentException {
        List list = document.selectNodes( //a/@href );
        for (Iterator iter = list.iterator(); iter.hasNext(); ) {
            Attribute attribute = (Attribute) iter.next();
            String url = attribute.getValue();
        }
     }

5字符串与XML的转换

有时候经常要用到字符串转换为XML或反之,

// XML转字符串

Document document = ...;

String text = document.asXML();

// 字符串转XML

String text = <person> <name>James</name> </person>;

Document document = DocumentHelper.parseText(text);
6 用XSLT转换XML

public Document styleDocument(
       Document document,String stylesheet
    ) throws Exception {
    // load the transformer using JAXP
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(
       new StreamSource( stylesheet )
    );
    // now lets style the given document
    DocumentSource source = new DocumentSource( document );
    DocumentResult result = new DocumentResult();
    transformer.transform( source,result );
    // return the transformed document
    Document transformedDoc = result.getDocument();
    return transformedDoc;
}
7 创建XML

public Document createDocument() {
       Document document = DocumentHelper.createDocument();
       Element root = document.addElement(root);
       Element author1 =
           root
              .addElement(author)
              .addAttribute(name,James)
              .addAttribute(location,UK)
              .addText(James Strachan);
       Element author2 =
           root
              .addElement(author)
              .addAttribute(name,Bob)
              .addAttribute(location,US)
              .addText(Bob McWhirter);
       return document;
    }
8 文件输出

一个简单的输出方法是将一个Document或任何的Node通过write方法输出
 
    FileWriter out = new FileWriter( foo.xml );
    document.write(out);
 
  如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类
 
    public void write(Document document) throws IOException {
       // 指定文件
       XMLWriter writer = new XMLWriter(
           new FileWriter( output.xml )
       );
       writer.write( document );
       writer.close();
       // 美化格式
       OutputFormat format = OutputFormat.createPrettyPrint();
       writer = new XMLWriter( System.out,format );
       writer.write( document );
       // 缩减格式
       format = OutputFormat.createCompactFormat();
       writer = new XMLWriter( System.out,format );
       writer.write( document );
    }

参考文档:http://xhy0422.iteye.com/blog/50235

参考文档: http://www.52php.cn/article/p-utbzmdwk-bhw.html


总结一下,本博客主要介绍了xml和dom相关知识以及如何用dom4j操作XML

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读