EXTJS 4.2 escape colon (:) in XML Tag for XML Reader

霸气de小男生 提交于 2019-12-11 19:49:23

问题


I am trying to load atom pub CMIS 1.0 binding into EXTJS and the colons in the tags are stopping the XML reader from doing its work. For instance the xml looks like:

<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.

For example if I consider a simple example

    <?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>

And I use EXTJS code

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();

});

What do I put down for the mapping for id, or alternate code?

fields: [{  name: "id", mapping: 'id:number'} ????? escape the ':' some how?

I am trying to avoid writing a lot of custom XML parsing code if possible and rely on the EXTJS reader, and the CMIS 1.1 browser binding is not available for my ECM.


回答1:


I have found the solution is addressed in EXTJS 4 but not in earlier versions that I am familiar with (3.4): The namespaces character | was introduced in EXTJS 4 DomQuery

So if the example XML has a defined namespace such as xmlns:id="http://my.example.com/id

Then the XML with the namespace modified from before is:

<?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>

So that the following EXTJS code will then work fields: [{ name: "id", mapping: 'id|id'}

that is the full solution is

<!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> 

Also note that if the namespace is used in the root element before the namespace is defined then the root definition in the XML reader needs to use the : not the | character i.e root: 'id:users'




回答2:


I am also facing the same issue i am using extjs-4.2.1

my sample xml

<RDF>
    <Seq about="urn:productManagement:root" type="ROOT" ac:maxLevels="25">
        <li>
            <Description ac:name="name1" ac:type="type1"/>
        </li>
    </Seq>
</RDF>

Model for above 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'}
        ]
});

I tried pipe replacing : with | but it didn't work for me. Need help.



来源:https://stackoverflow.com/questions/20256425/extjs-4-2-escape-colon-in-xml-tag-for-xml-reader

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!