Jquery操作Xml

Jquery1.2开始不再支持XPath表达式。

<?xml version="1.0" encoding="utf-8" ?>
<catalog>
          <book format="trade">
                    <name>Jennifer Government</name>
                    <author>Max Barry</author>
                    <price curr="CAD">15.00</price>
                    <price curr="USD">12.00</price>
          </book>
          <book format="trade">
                    <name>xennifer xovernment</name>
                    <author>xax Barry</author>
                    <price curr="CAD">18.00</price>
                    <price curr="USD">12.00</price>
          </book>
          <book format="textbook">
                    <name>Unity Game Development Essentials</name>
                    <author>Will Goldstone</author>
                    <price curr="CAD">52.00</price>
                    <price curr="USD">45.00</price>
          </book>

<book format="textbook">
                    <name>UNIX Visual QuickPro</name>
                    <author>Chris Herborth</author>
                    <price curr="CAD">15.00</price>
                    <price curr="USD">10.00</price>
          </book>
</catalog>

xml

$(document).ready(function () {
    $.ajax({
        url: "/Test.xml",
        dataType: "xml",
        type: "get",
        success: function (xml) {                
            var books = $(xml).find("book[format='trade']");
            books.each(function (index, item) {
                var json = {
                    name: $(this).children("name").text(),
                    author: $(this).children("author").text(),
                    priceCAD: $(this).children("price[curr='CAD']").text(),
                    priceUSD: $(this).children("price[curr='USD']").text()
                };
                var jsonStr = $.param(json);//序列化json
                $("#box").append("<div>" + jsonStr + "</div>");
            });                
        },
        error: function () {
            alert('未能正确加载该文件')
        }
    });
});

XPath路径表达式

XPath路径表达式用于在XML文档中查找节点,对节点进行遍历操作。

基本概念

1.一份XML文档分元素、属性、文本(原子值,文本节点没有任何祖先节点)、命名空间、处理指令、注释以及文档节点(根节点),节点以Node表示,父(Parent)、子(Children)、兄弟(Sibling)、祖先(Ancestor)、后代(Descendant)。属性节点是作为元素节点的子节点,而文本节点则不属于元素节点的子节点。

2.nodeValue(节点值) | nodeType(节点类型) | nodeName(节点名称) | textContent(节点包含的文本)

属性节点的nodeValue是属性的值。文本节点的nodeValue是文本自身。文本节点的nodeName永远返回#text,元素节点没有nodeValue。

例子

<?xml version="1.0" encoding="utf-8" ?>
<catalog>
          <book format="trade" id="res">
                    <name>Jennifer Government</name>
                    <author>Max Barry</author>
                    <price curr="CAD" >15.00</price>
                    <price curr="USD">12.00</price>
          </book>
          <book format="trade" id="rxes">
                    <name>xennifer xovernment</name>
                    <author>xax Barry</author>
                    <price curr="CAD">18.00</price>
                    <price curr="USD">12.00</price>
          </book>
          <book format="textbook">
                    <name>Unity Game Development Essentials</name>
                    <author>Will Goldstone</author>
                    <price curr="CAD">52.00</price>
                    <price curr="USD">45.00</price>
          </book>

<book format="textbook">
                    <name>UNIX Visual QuickPro</name>
                    <author>Chris Herborth</author>
                    <price curr="CAD">15.00</price>
                    <price curr="USD">10.00</price>
          </book>
          <x>
                    <book format="xxxxx">
                              <name>xxxxx</name>
                              <author>xxxxx</author>
                              <price curr="CAD">xxxxx</price>
                              <price curr="USD">xxxxx</price>
                    </book>
          </x>
</catalog>

xml

// 加载xml文档
function loadXML(xmlFile) {
    var xmlDoc;
    if (window.ActiveXObject) {
        xmlDoc = new ActiveXObject('Microsoft.XMLDOM');//IE浏览器
        xmlDoc.async = false;
        xmlDoc.load(xmlFile);
    }
    else if (isFirefox = navigator.userAgent.indexOf("Firefox") > ) { //火狐浏览器
        //else if (document.implementation && document.implementation.createDocument) {//这里主要是对谷歌浏览器进行处理
        xmlDoc = document.implementation.createDocument('', '', null);
        xmlDoc.load(xmlFile);
    }
    else { //谷歌浏览器
        var xmlhttp = new window.XMLHttpRequest();
        xmlhttp.open("GET", xmlFile, false);
        xmlhttp.send(null);
        if (xmlhttp.readyState == ) {
            xmlDoc = xmlhttp.responseXML.documentElement;
        }
    }
    return xmlDoc;
}

//根据指定的XPATH表达式查找满足条件的所有节点
//@param xmldoc 执行查找的节点
//@param sXpath xpath的表达式
function selectNodes(xmldoc, sXpath) {

if (window.ActiveXObject) {
        //IE浏览器
        return xmldoc.selectNodes(sXpath);
    } else if (window.XPathEvaluator) {
        //FireFox类浏览器
        var xpathObj = new XPathEvaluator();

if (xpathObj) {
            var result = xpathObj.evaluate(sXpath, xmldoc, null, XPathResult.ORDERED_NODE_ITEARTOR_TYPE, null);
            var nodes = new Array();
            var node;
            while ((node = result.iterateNext()) != null) {
                nodes.push(node);
            }
            return nodes;

} else {

return null;
        }

} else {
        return null;
    }
}

加载和选取Xml节点的函数

$(document).ready(function () {
    var xml = loadXML("/Test.xml");
    var xPath = "/catalog/book"; //获取根catalog节点下面的所有book子节点
    var books = selectNodes(xml, xPath);
    books.forEach(function (item, index, books) {
        alert(item.textContent);//当前节点包含的所有原子值(文本)     
        //alert(item.nodeName); 
        //alert(item.nodeType);
        //alert(item.nodeValue);
    });
});

规则

/*注意*/
/*xPath表达式获取的默认都是节点的集合*/
/*如果表达式起始以/开头,则表示节点的绝对路径,
如果以//开头,则表示无视嵌套层级关系(无视路径),
如果不以/开始,则表示获取所有最上层的指定的节点
/..表示当前节点的父节点
*/ /*路径表达式,路径表达式只能获取元素节点,如果要获取属性节点,则使用谓词,获取文本节点则使用node.textContent*/
//用于提取节点
var xPath = "/catalog"; //获取根节点
var xPath = "book"; //获取处于最顶层(相对而言)的所有book节点,如上面的xml文档中的x节点下的book将不会被获取
var xPath = "/catalog/book"; //获取根catalog节点下面的所有book子节点
var xPath = "/catalog/book/."; //获取根catalog节点下面的所有book节点
var xPath = "/catalog/book/.."; //获取根catalog节点下面的所有book节点的父节点,在此例子中是获取根
var xPath = "//book"; //获取文档中所有的book节点,双斜杠表示不从根开始,无视嵌套的层级获取文档中所有指定的节点,不管节点处于怎样的位置,只要在文档中就会被获取   
var xPath = "book//name";//获取book节点下的所有的name子节点,无视name的嵌套层级 /*谓词,这些谓词都可以搭配以上的路径表达式*/
//用于进一步过滤节点
var xPath = "/catalog/book[1]"; //第一个
var xPath = "/catalog/book[last()]"; //最后一个
var xPath = "/catalog/book[last()-1]"; //倒数第二个
var xPath = "/catalog/book[position()<3]"; //靠前的两个
var xPath = "/catalog/book[@format]"; //必须具有format属性
var xPath = "/catalog/book[@format='trade']"; //必须具有format属性且值为trade 
var xPath = "*"; //所有节点
var xPath = "@*"; //所有属性节点
var xPath = "/catalog/book[price>30.00]"; //获取book节点,但book包含的price节点所包含的文本必须>30.00
var xPath = "/catalog/book[price>30.00]/title"; //获取book下的title节点,但book包含的price节点所包含的文本必须>30.00
var xPath = "/catalog/book/price | /catalog/book/name"; //和 ,集合会按顺序先存储price,再存储name
var xPath = "/catalog/book/price | //name"; //和,集合会按顺序先存储price,再存储文档中无视嵌套层级的name /*轴,这些轴都可以搭配以上的路径表达式*/
var xPath = "/catalog/book/price/ancestor::book"; //祖先元素节点,获取price的祖先元素节点book    
var xPath = "/catalog/book/descendant::price"; //后代元素节点,获取book的后代元素节点price    
var xPath = "/catalog/book/ancestor-or-self::book"; //祖先元素节点以及自身,获取book的祖先元素节点以及自身
var xPath = "/catalog/book/child::*"; //所有子元素节点
var xPath = "/catalog/book/child::price"; //子元素节点,子元素节点必须是price
var xPath = "/catalog/book/child::*/child::price"; //所有子元素节点的子元素,子元素必须是price
var xPath = "/catalog/book/child::node()"; //所有子节点
var xPath = "/catalog/book/price/attribute::*"; //price的所有属性节点
var xPath = "/catalog/book/price/child::text()"; //price的所有文本节点
var xPath = "/catalog/book/price[text()='12.00']"; //price包含的文本=12.00的文本节点
var xPath = "/catalog/book[starts-with(@id,'r')] "; //具有id属性且id属性的值以r开头的book元素节点,此方法只能用于属性节点
var xPath = "/catalog/book[contains(@id,'e')] "; //具有id属性且id属性的值包含了e字符的book元素节点 此方法只能用于属性节点 /*运算符,这些运算符都可以搭配以上的路径表达式*/
//+、-、*、div、=、!=、<、>、<=、>=、and、mod
var xPath = "/catalog/book[price div 2 > 10 ]"; //按计算结果获取book元素节点,条件:price所包含的文本÷2>10的book节点。

ASP.NET MVC - XML节点查找的更多相关文章

  1. 在你的ASP.NET MVC中使用查找功能

    在程序中,使用查找功能是少之不了.今天在ASP.NET环境下演示一回. 在cshtml视图中,有三个文本框,让用户输入关键词,然后点击最右连的“搜索”铵钮,如果有结果将显示于下面. Html: 表格放 ...

  2. asp.net MVC 路由机制

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  3. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  4. 路由 - ASP.NET MVC 4 系列

           软件开发人员常常对一些细小的细节问题倍加关注,由其在考虑源代码的质量和结构时更是如此.因此,当遇到大部分使用 ASP.NET 技术构建的站点,使用如下的 URL 地址时,可能会有些奇怪: ...

  5. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  6. asp.net mvc后台操作之读写xml控制首页动态页面开关显示

    一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制 ...

  7. ASP.NET MVC读取XML并使用ViewData显示

    看到网上一个网友问及,无法获取XML某一个节点内容.下面Insus.NET在ASP.NET MVC环境下实现它. 先把XML文件放入App_Data目录,当然你可以放在自建目录中.打开看看它有几层,几 ...

  8. Asp.net mvc返回Xml结果,扩展Controller实现XmlResult以返回XML格式数据

    我们都知道Asp.net MVC自带的Action可以有多种类型,比如ActionResult,ContentResult,JsonResult……,但是很遗憾没有支持直接返回XML的XmlResul ...

  9. 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

    http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...

随机推荐

  1. java和c#中的装箱和拆箱操作

    c#装箱和拆箱 装箱:整体上来说,装箱是将值类型转换成引用类型,比如将Vector3转换成Object类型. 具体而言: 1)在托管堆中为值类型分配内存.除了原始的数值以外还应该有指向该数值的引用. ...

  2. Luogu P3181 [HAOI2016]找相同字符 广义$SAM$

    题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt ...

  3. Shiro进行简单的身份验证(二)

    一个Realm数据源: shiro.ini: [users] wp=123456 main方法执行认证: package com.wp.shiro; import org.apache.shiro.S ...

  4. linux备份用户权限

    1:切换root用户,进入home目录,执行以下命令: [root@localhost home]# ll /home/wangfajun 2: home目录下执行以下命令进行wangfajun用户的 ...

  5. Markdown Cheatsheet

    This is intended as a quick reference and showcase. For more complete info, see John Gruber's origin ...

  6. 原生JavaScript运动功能系列(三):多物体多值运动

    多物体同时出发运动函数实现 多属性同步运动变化实现 一.多物同时触发运动函数实现 前面两个动画示例基本理解了动画的核心:位置变化和速度变化,操作的核心就是定时器分段叠加属性值.但是动画还是基于单个元素 ...

  7. 数据库操作中如何批量执行多个sql文件?

    数据库操作中如何批量执行多个sql文件? 1.应用场景:在历史数据导入过程中,会发现有很多个表形成的.sql文件,要是一个一个文件去手动执行,实在是费时间,所以采取以下方法. 2.将文件放在一定位置, ...

  8. [leetcode-128] 最长连续序列

    给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, ...

  9. HTML第二耍 列表标签

    先复习下上一节 <!doctype html> <html> <head> <meta charset="utf-8"> <t ...

  10. Spark MLlib 机器学习

    本章导读 机器学习(machine learning, ML)是一门涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多领域的交叉学科.ML专注于研究计算机模拟或实现人类的学习行为,以获取新知识.新 ...