一、XML
XML,是指可扩展标记语言,其作用主要用来传输和存储数据,而HTML主要用来显示数据。XML标签并未被预定义,这意味着,XML标签都是自定义的,且XML具有两个重要的特点—XML的文档类型与XML的可移植性(都采用了Unicode标准的编码系统)。故而,当需要调用第三方接口时(参数为XML形式),我们需要知道第三方的xml标签、层结构。通过XML,数据能够存储在独立的XML文件中,而通过js代码,就可以读取一个外部XML文件。
XML文档具有不同的类型,XML的组成部分及XML的结构形式地定义了文档的类型。XML文档形成了一种树结构,由根到干再到枝叶。这意味着,XML文档必须含有根元素,就像树必须有根一样,且根元素是所有其他元素的父元素。xml文档中的元素之间的关系可以用家族关系来形容。
在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。
XML元素也可拥有属性,但其属性值必须加引号,且特定的属性名在同一个元素标记中只能出现一次。
XML文档由命名容器及这些命名容器所包含的数据值组成。这些容器通常表示为声明【确定了XML的版本】、元素和属性【XML文档中存放数据的另一种方式,在起始标签中添加属性,从而达到更好地表示元素的内容】。
XML用于将数据组织为一棵树,DOM(文档对象模型)通过解析XML文档,为XML在逻辑上建立一个树模型,树的节点是一个个的对象。
二、JSON
JSON语法是JS语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON实例--创建包含JSON语法的JS字符串
var txt = '{ "employees" : [' + '{ "firstName":"Bill" , "lastName":"Gates" },' + '{ "firstName":"George" , "lastName":"Bush" },' + '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。
eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:
var obj = eval ("(" + txt + ")");
关于JSON,最重要的是理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但JSON 并不属于js。毕竟JSON只是一种数据格式,不单单js可以使用
JSON中没有变量的概念!!!
//json,它是一种使用普通文本来表示简单数据结构的标准,它使用双引号来描述字符串,
//例如:
"this is a simple json string"
//使用方括号来描述列表
//例如:
[2,5,56]
//使用花括号来描述对象(键值对的集合)
{"key":"value"}
//何为Collection+json?
//Collection+json是一个用于在Web上发布资源的可搜索列表的标准。JSON将约束建立在普通文本上,
//而Collection+json则将约束建立在JSON上,这意味着它可以仅仅提供一个json对象
//例如:{}
//但是又不仅仅是一个对象,这个对象还必须拥有一个成为collection的属性,该属性可以映射到另一个对象
//例如:{"collection":{}}
//而该“collection”对象应该具有一个称为items的属性,该属性映射到一个列表
//例如:{"collection":{"items":[]}}
//在items列表属性中的项目也必须是对象
//{"collection"{"items":[{},{},{}]}}
//如此反复,最终得到一个高度格式化的文档
{"collection":
{
"key1":"1.2",
"key2":"dddd",
"items"[
{},{},{"datas":[{},{}]}
]
}
}
JSON与JavaScript
JSON数据结构可以解析为有用的JavaScript对象,而XML数据结构则需要解析成DOM文档且从中提取数据较为麻烦。JSON对象中有两个方法分别将json解析为JavaScript对象和将JavaScript对象解析为JSON对象。
<script>
var book = {
title: "钢铁是怎么练成的",
author: [
"柯察金", "保尔"
],
year: 2005
};
var jsonText = JSON.stringify(book);
console.log(jsonText);
</script>
<script>
var book = {
title: "钢铁是怎么练成的",
author: [{
fistName: "保尔",
lastname:"柯察金"
}, {
fistName: "保尔2",
lastname: "柯察金2"
}],
year: 2005
};
var jsonText = JSON.stringify(book);
console.log(jsonText);
</script>
<script>
var book = {
title: "钢铁是怎么练成的",
author: [{
fistName: "保尔",
lastname:"柯察金"
}, {
fistName: "保尔2",
lastname: "柯察金2"
}],
year: 2005
};
var jsonText = JSON.stringify(book);
console.log(jsonText);
var bookCopy = JSON.parse(jsonText);
console.log(bookCopy);
console.log(bookCopy.title);
console.log(bookCopy.author[0].fistName);
</script>
实际上,JSON.stringify()除了可以序列化JavaScript对象外,还可接收另外两个参数,这两个参数用于指定
以不同的方式序列化JavaScript对象
第一个参数:过滤器或是一个数组或函数,即用于过滤属性
第二个参数:是一个选项,表示是否在JSON字符串中保留缩进
<script>
var book = {
title: "钢铁是怎么练成的",
author: [{
fistName: "保尔",
lastname:"柯察金"
}, {
fistName: "保尔2",
lastname: "柯察金2"
}],
year: 2005
};
var jsonText = JSON.stringify(book,["title","year"],3);
console.log(jsonText);
var bookCopy = JSON.parse(jsonText);
console.log(bookCopy);
console.log(bookCopy.title);
console.log(bookCopy.author[0].fistName);
</script>
<body>
<input type="text" name="name" id="inp" />
<script>
var book = {
title: "钢铁是怎么练成的",
author: [{
fistName: "保尔",
lastname:"柯察金"
}, {
fistName: "保尔2",
lastname: "柯察金2"
}],
year: 2005
};
var jsonText = JSON.stringify(book, function (key,value) {
switch (key) {
case "title":
return value+"New";
case "author":
return value[0]["fistName"] + "Array";
default:
return value;
}
});
console.log(jsonText);
</script>
</body>
三、XML转化为JSON
3.1 示例1--最简单的一种形式
<datas>
<DATA>
<new_deliverynumber>X401-HN1902240001</new_deliverynumber>
<new_recevicer>徐帅</new_recevicer>
<new_receivephone>17306207002</new_receivephone>
<ITEM>
<new_product_id>152940278</new_product_id>
<new_seq>2</new_seq>
</ITEM>
</DATA>
</datas>
将上述xml转换为json格式:
{
"datas": {
"DATA": {
"new_deliverynumber": "X401-HN1902240001",
"new_recevicer": "徐帅",
"new_receivephone": "17306207002",
"ITEM": {
"new_product_id": "152940278",
"new_seq": "2"
}
}
}
}
此时须将json格式转换为对象实例,因此应当对json格式进行处理成如下:
{"new_deliverynumber":"X401-HN1902240001","new_recevicer":"徐帅","new_receivephone":"17306207002",
"ITEM":[{"new_product_id":"152940278","new_seq":"2"}]}
处理代码
public static string MoreJsonFormat(string json)
{
var jsonStr = json.Substring(17, json.Length - 19);
if (jsonStr.IndexOf("]}}") < 0)
{
jsonStr = jsonStr.Replace(":{", ":[{").Replace("}}", "}]}");
}
return jsonStr;
}
注意:对于截取字符串,起始位置从17好理解,对比于需要将json格式处理成的最终结果。那么为什么是减19呢?
以下为解释19从何而来
Console.WriteLine(json.LastIndexOf('}'));//166,即json最后一个字符的位置为166
Console.WriteLine(json.IndexOf('}'));//163
由于substring()方法第二个参数为截取字符串的长度,前面舍去17个字符串,后面去掉两个’}‘,加起来正好是19个字符。
代码附上:
实体类:
/// <summary>
/// 出货通知单
/// </summary>
public class TruckloadingModel
{
/// <summary>
/// 出货通知单号
/// </summary>
public string new_deliverynumber { get; set; }
/// <summary>
/// 收货人
/// </summary>
public string new_recevicer { get; set; }
/// <summary>
/// 收货电话
/// </summary>
/// <summary>
/// 明细
/// </summary>
public List<TruckoloadingLineModel> ITEM { get; set; }
}
/// <summary>
/// 出货通知单明细
/// </summary>
public class TruckoloadingLineModel
{
/// <summary>
/// 调度单号
/// </summary>
public string new_dispatchnumber { get; set; }
/// <summary>
/// 项次
/// </summary>
public string new_seq { get; set; }
/// <summary>
/// 产品编码
/// </summary>
}
处理代码:
static void Main(string[] args)
{
string xml = @"<datas>
<DATA>
<new_deliverynumber>X401-HN1902240001</new_deliverynumber>
<new_recevicer>徐帅</new_recevicer>
<new_receivephone>17306207002</new_receivephone>
<ITEM>
<new_product_id>152940278</new_product_id>
<new_seq>2</new_seq>
</ITEM>
</DATA>
</datas>";
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
//Xml格式转json处理
string json = JsonConvert.SerializeXmlNode(document);
//Xml格式转json处理
var models = new List<TruckloadingModel>();
var truckloading = new TruckloadingModel();
truckloading = JsonUtils.DeserializeObject<TruckloadingModel>(MoreJsonFormat(json));
Console.WriteLine(MoreJsonFormat(json));
models.Add(truckloading);
Console.ReadKey();
}
如果再加一条明细呢?是不是代码依然可以这样写?这时依然需要观察转换为json之后的格式是不是处理方式依然如此!
{
"datas": {
"DATA": {
"new_deliverynumber": "X401-HN1902240001",
"new_recevicer": "徐帅",
"new_receivephone": "17306207002",
"ITEM": [
{
"new_product_id": "152940278",
"new_seq": "2"
},
{
"new_product_id": "152940278",
"new_seq": "2"
}
]
}
}
}
其可转换为对象的格式为:
{"new_deliverynumber":"X401-HN1902240001","new_recevicer":"徐帅","new_receivephone":"17306207002",
"ITEM":[{"new_product_id":"152940278","new_seq":"2"},{"new_product_id":"152940278","new_seq":"2"}]}
观察而言,截取字符串时,起始位置为17没有问题,去掉最后两个’}‘,刚好。因此,用同一种方式处理没有问题。
现在可以确定,无论加多少条明细,上述提供的方法皆可使用。那么,如果是提供两个data呢?不外乎有如下几种形式:
示例2:
xml形式一
<datas>
<DATA>
<new_deliverynumber>X401-HN1902240001</new_deliverynumber>
<new_recevicer>徐帅</new_recevicer>
<new_receivephone>17306207002</new_receivephone>
<ITEM>
<new_product_id>152940278</new_product_id>
<new_seq>2</new_seq>
</ITEM>
</DATA>
<DATA>
<new_deliverynumber>X401-HN1902240002</new_deliverynumber>
<new_recevicer>蓉姐</new_recevicer>
<new_receivephone>18361337238</new_receivephone>
<ITEM>
<new_product_id>23232334</new_product_id>
<new_seq>3</new_seq>
</ITEM>
</DATA>
</datas>
转换为json
{
"datas": {
"DATA": [
{
"new_deliverynumber": "X401-HN1902240001",
"new_recevicer": "徐帅",
"new_receivephone": "17306207002",
"ITEM": {
"new_product_id": "152940278",
"new_seq": "2"
}
},
{
"new_deliverynumber": "X401-HN1902240001",
"new_recevicer": "徐帅",
"new_receivephone": "17306207002",
"ITEM": {
"new_product_id": "152940278",
"new_seq": "2"
}
}
]
}
}
将json处理为可转换为对象的数据
[{"new_deliverynumber":"X401-HN1902240001","new_recevicer":"徐帅","new_receivephone":"17306207002",
"ITEM":[{"new_product_id":"152940278","new_seq":"2"}]},
{"new_deliverynumber":"X401-HN1902240002","new_recevicer":"蓉姐","new_receivephone":"18361337238",
"ITEM":[{"new_product_id":"678789520","new_seq":"3"}]}]
观察后得到,截取字符串时,从17开始没有问题,19也没有问题,明显适合第一种处理方式。但值得注意的是,此时是批量传输,应用数组来接收。直接上图
models = JsonUtils.DeserializeObject<List<TruckloadingModel>>(MoreJsonFormat(json));
还有一种情况,就是多个主档下又有多个明细。这里不再展现,直接给代码:
static void Main(string[] args)
{
string xml = @"<datas>
<DATA>
<new_deliverynumber>X401-HN1902240001</new_deliverynumber>
<new_recevicer>徐帅</new_recevicer>
<new_receivephone>17306207002</new_receivephone>
<ITEM>
<new_product_id>152940278</new_product_id>
<new_seq>2</new_seq>
</ITEM>
</DATA>
<DATA>
<new_deliverynumber>X401-HN1902240001</new_deliverynumber>
<new_recevicer>徐帅</new_recevicer>
<new_receivephone>17306207002</new_receivephone>
<ITEM>
<new_product_id>152940278</new_product_id>
<new_seq>2</new_seq>
</ITEM>
</DATA>
</datas>";
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
//Xml格式转json处理
string json = JsonConvert.SerializeXmlNode(document);
Console.WriteLine("json格式:");
Console.WriteLine("*****************************************************************");
Console.WriteLine(json);
Console.WriteLine("*****************************************************************");
//Xml格式转json处理
var models = new List<TruckloadingModel>();
if (json.IndexOf("[{") > 0 && json.IndexOf("}]") > 0&&json.IndexOf("}]}]")>0)
{
json = "splitmark" + json.Substring(18);
Console.WriteLine(("[" + Regex.Split(Regex.Split(json, "splitmark")[1], "]}}")[0] + "]").Replace(":{", ":[{").Replace("}}", "}]}"));
models = JsonUtils.DeserializeObject<List<TruckloadingModel>>(("[" + Regex.Split(Regex.Split(json, "splitmark")[1], "]}}")[0] + "]").Replace(":{", ":[{").Replace("}}", "}]}"));
}
else if (json.IndexOf("}}]}}")>0)
{
models = JsonUtils.DeserializeObject<List<TruckloadingModel>>(MoreJsonFormat(json));
}
else
{
var truckloading = new TruckloadingModel();
Console.WriteLine(MoreJsonFormat(json));
truckloading = JsonUtils.DeserializeObject<TruckloadingModel>(MoreJsonFormat(json));
models.Add(truckloading);
}
Console.ReadKey();
}
四、URI和XML命名空间
在Web体系结构中,资源标识符具有统一的语法,可以通过资源标识符来表示资源、描述资源、访问资源及共享资源。在WWW中,统一资源标识符是标识资源的基础。
XML命名空间的作用是防止标签名重复导致存在可能的命名冲突。
五、定义XML文档中的结构
模式是定义XML标签和XML结构的方式之一。每一类模式都可作为一种描述数据特性的方式,并可以通过规则和约束来引用文档。在XML技术中,模式通常指的是一种特定的文档,该文档用于定义某一类型的XML文档的内容和结构。
5.1 XML模式定义语言(XML Schema Definition Language,XSD)
XSD提供了一种粒度化的方式,可用于描述XML文档的内容。
XML模式由模式组件构成。模式组是一些构建模块,可用于构建模式的抽象数据类型。元素和属性的声明、复合类型和简单类型的定义以及通知等,都属于模式组件。
XML模式组件包括:数据类型、元素类型和属性声明、约束、元素之间的关联关系、命名空间,并且支持模块化的import/include选项。通过外部管理的XML模式,import/include选项之间用于包含可复用的结构、容器和自定义数据类型。
5.2 XML模式文档
XML具有很强的验证XML文档的功能。由于模式可用于阐明在XML文档中的数据类型,因此可以使用模式检查XML文档的准确性。