使用rest方式修改服务端xml文件

时间:2023-12-09 23:27:01

想法:

最近想用REST的方式去修改一个远端的xml文件,于是自己写了个Handler

设计:

用现成的XPath,和GET,POST,PUT,DELETE这4个http方法作为动作,达到直接读写xml

限制:

在一些浏览器中“//”和“..”会被直接翻译,因此需要使用这些的时候,不得不使用XPath的完整形式

PUT方法不能新建不存在的节点,因为XPath中不包含足够的定位信息

POST方法只能以节点为单位,且只能添加在最后

使用MVC4

代码:

https://github.com/vwxyzh/XmlRestHandler

使用:

只需要注册Handler

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "xml",
routeTemplate: "xml/{*path}",
defaults: new { path = "/" },
constraints: null,
handler: new XmlRestHandler("App_Data/yours.xml"));

然后,就可以使用了
例子:

首先Xml:

<?xml version="1.0" encoding="utf-8"?>
<root>
<users>
<user name="abc" age="">
<roles>
<role ref="admin" />
</roles>
</user>
<user name="def" age="">
<roles>
<role ref="reader" />
</roles>
</user>
</users>
<roles>
<role name="admin" />
<role name="reader" />
</roles>
</root>

1.找出所有角色有admin的用户的名字:

GET http://hostname/virtualpath/xml/root/users/user[roles/role/@ref="admin"]/@name

返回:

name="abc"

2.把角色reader改名成normaluser:

PUT http://hostname/virtualpath/xml/(descendant::role[@name="reader"]/@name|descendant::role[@ref="reader"]/@ref)

normaluser

3.需要添加一个角色monitor:

POST http://hostname/virtualpath/xml/root/roles

<role name="monitor" />

4.删除所有用户的age属性:

DELETE http://hostname/virtualpath/xml/descendant::user/@age