2013-11-28 33 views
0

我正試圖加載原子庫將CMIS 1.0綁定到EXTJS中,並且標記中的冒號正在阻止XML閱讀器執行其工作。例如在XML的樣子:EXTJS 4.2轉義冒號(:)用於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>[email protected]</email> 
    </user> 
    <user attr="test abe"> 
     <id:number>2</id:number> 
     <name>Abe Elias</name> 
     <email>[email protected]</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的讀者,和CMIS 1.1瀏覽器結合不適用於我的ECM。

回答

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>[email protected]</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>[email protected]</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閱讀器中的根定義需要使用:not the |性格即 root: 'id:users'

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>[email protected]:type'}, 
      { name: "name", mapping:'li>[email protected]:name'} 
     ] 
}); 

我試圖用管道代替:|但它不適合我。需要幫忙。

+0

您需要在示例中的第一個標記中添加xmlns:ac =「http://my.example.com/ac」,以便定義名稱空間。然後是|將工作。 – user3044055