我正在尝试将atom pub CMIS 1.0绑定加载到EXTJS中,并且标记中的冒号阻止XML读取器执行其工作。例如,xml看起来像:
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cmis="http://docs.oasis- open.org/ns/cmis/core/200908/" xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/" xmlns:app="http://www.w3.org/2007/app">
<atom:author>
<atom:name>system</atom:name>
</atom:author>
<atom:id>http://chemistry.apache.org/MTAz</atom:id>
<atom:published>2013-11-28T00:01:22Z</atom:published>
<atom:title>Folder1</atom:title>
<app:edited>2013-11-28T00:01:22Z</app:edited>
<atom:updated>2013-11-28T00:01:22Z</atom:updated>
<cmisra:object xmlns:ns3="http://docs.oasis-open.org/ns/cmis/messaging/200908/">
<cmis:properties>
<cmis:propertyId queryName="cmis:allowedChildObjectTypeIds" displayName="Allowed Child Types" localName="cmis:allowedChildObjectTypeIds" propertyDefinitionId="cmis:allowedChildObjectTypeIds">
<cmis:value>*</cmis:value>
</cmis:propertyId>
<cmis:propertyId queryName="cmis:objectTypeId" displayName="Type-Id" localName="cmis:objectTypeId" propertyDefinitionId="cmis:objectTypeId">
<cmis:value>cmis:folder</cmis:value>
</cmis:propertyId>
<cmis:propertyString queryName="cmis:path" displayName="Path" localName="cmis:path" propertyDefinitionId="cmis:path">
<cmis:value>/Root/396271/Folder1</cmis:value>
</cmis:propertyString>
<cmis:propertyString queryName="cmis:name" displayName="Name" localName="cmis:name" propertyDefinitionId="cmis:name">
<cmis:value>Folder1</cmis:value>
</cmis:propertyString>
..... etc.
例如,如果我考虑一个简单的例子
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user attr="test ed">
<id:number>1</id:number>
<name>Ed Spencer</name>
<email>ed@sencha.com</email>
</user>
<user attr="test abe">
<id:number>2</id:number>
<name>Abe Elias</name>
<email>abe@sencha.com</email>
</user>
</users>
我使用EXTJS代码
Ext.onReady(function () {
Ext.define('User', {
extend: 'Ext.data.Model',
autoload: true,
fields: [{ name: "id", mapping: 'id:number'},
{ name: "name", mapping: 'name'},
{ name: "email", mapping: 'email'},
{ name: "attr", mapping: '@attr'}]
});
var store = Ext.create('Ext.data.Store', {
model: 'User',
proxy: {
type: 'ajax',
url : 'users.xml',
reader: {
type: 'xml',
record: 'user',
root: 'users'
}
}
});
store.load();
});
我为id或替代代码的映射做了什么?
fields: [{ name: "id", mapping: 'id:number'} ????? escape the ':' some how?
我试图避免编写大量自定义XML解析代码(如果可能)并依赖于EXTJS读取器,并且我的ECM无法使用CMIS 1.1浏览器绑定。
答案 0 :(得分:0)
我发现解决方案已在EXTJS 4中解决,但在我熟悉的早期版本中没有解决(3.4):名称空间字符|在EXTJS 4 DomQuery中引入了
因此,如果示例XML具有已定义的命名空间,例如xmlns:id="http://my.example.com/id
然后,具有从之前修改的命名空间的XML是:
<?xml version="1.0" encoding="UTF-8"?>
<users xmlns:id="http://my.example.com/id">
<id:user attr="test ed">
<id:id>1</id:id>
<id:name>
<id:first attr2="test ed 2">Ed</id:first>
<id:last>Spencer</id:last>
</id:name>
<id:email>ed@sencha.com</id:email>
</id:user>
<id:user attr="test abe">
<id:id>2</id:id>
<id:name>
<id:first attr2="test ed 2">Abe</id:first>
<id:last>Elias</id:last>
</id:name>
<id:email>abe@sencha.com</id:email>
</id:user>
</users>
然后,以下EXTJS代码将起作用fields: [{ name: "id", mapping: 'id|id'}
这是完整的解决方案
<!DOCTYPE html>
<html>
<head>
<link href="http://cdn.sencha.com/ext/gpl/4.2.1/resources/css/ext-all.css" rel="stylesheet" />
<script src="http://cdn.sencha.com/ext/gpl/4.2.1/ext-all.js"></script>
<script>
function getResult()
{
document.getElementById("demo").innerHTML=
"<p>First Record Id is: " + test.data.items[0].data.id + "</p>" +
"<p> First Name is: " + test.data.items[0].data.first + "</p>" +
"<p> Last Name is: " + test.data.items[0].data.last + "</p>" +
"<p> Email is: " + test.data.items[0].data.email + "</p>" +
"<p> Attribute 1 is: " + test.data.items[0].data.attr + "</p>" +
"<p> Attribute 2 is: " + test.data.items[0].data.attr2 + "</p>";
}
var test;
Ext.onReady(function () {
Ext.define('User', {
extend: 'Ext.data.Model',
autoload: true,
fields: [{ name: "id", mapping: 'id|id'},
{ name: "first", mapping: 'id|name>id|first'},
{ name: "last", mapping: 'id|name>id|last'},
{ name: "email", mapping: 'id|email'},
{ name: "attr", mapping: '@attr'},
{ name: "attr2", mapping: "id|name>id|first[@attr2='test ed 2']"}]
});
var store = Ext.create('Ext.data.Store', {
model: 'User',
proxy: {
type: 'ajax',
url : 'users.xml',
reader: {
type: 'xml',
record: 'id|user',
root: 'users'
}
}
});
store.load();
test = store;
});
</script>
</head>
<body>
<h1>EXTJS Example</h1>
<p id="demo">Here we try to load XML into an EXTJS XML Reader</p>
<button type="button" onclick="getResult();">getResult</button>
</body>
</html>
另请注意,如果在定义命名空间之前在根元素中使用了命名空间,那么XML阅读器中的根定义需要使用:而不是|性格,即
root: 'id:users'
答案 1 :(得分:0)
我也面临同样的问题,我正在使用extjs-4.2.1
我的样本xml
<RDF>
<Seq about="urn:productManagement:root" type="ROOT" ac:maxLevels="25">
<li>
<Description ac:name="name1" ac:type="type1"/>
</li>
</Seq>
</RDF>
以上xml的模型
Ext.define('TR.model.TreeControlModel', {
extend: 'Ext.data.Model',
fields: [
{ name: 'about', mapping:'@about'},
{ name: 'type', mapping:'li>Description@ac:type'},
{ name: "name", mapping:'li>Description@ac:name'}
]
});
我尝试更换管道:使用|但它对我不起作用。需要帮助。