Backend Development
XML/RSS Tutorial
How to use XML to implement the structure of a multi-channel access website
How to use XML to implement the structure of a multi-channel access website
1. Background
In today’s websites, there are more and more access channels, and the technology is becoming more and more advanced, such as WAP, SMS, EMAIL, traditional Web, Socket, etc. If even the database and LDAP are considered to be connected, then the space that needs to be expanded in the design must be very good to ensure that when adding new channels, no more code modifications or even code changes are required. . But is it possible? I don’t think it is possible, but is there any way to better solve the perfection of this multi-channel access framework?
2. Architecture
[Figure 1]
As shown in Figure 1, when all the existing accesses have been used, the designers are dazzled. If it is to get a share, You can write these programs in any way, and they can definitely be implemented, but it will be more painful to maintain. Let’s go back to the question, how can we achieve a more perfect implementation? Figure 2 shows:

[Picture 2]
Picture 2 looks like an eight-clawed octopus. The octopus legs are connected to all access channels respectively. The core of connecting all these channels is the octopus head xmlRouter. The role of the Router here is to communicate across all channels, implement data routing, and enhance the scalability and flexibility of the system's architecture. The benefits will be many. It is called XMLRouter because if XML, a flexible and standardized language, is not used as a data transmission medium, the workload of the Router will also increase exponentially. Defining the XML specification will bring about future expansion. Comes with many benefits.
3. Ideas and Patterns
The original idea of XMLRouter came from the Builder Pattern in the computer motherboard and . The PCI slot of the computer motherboard defines the PCI specification. As long as The card you produce complies with the PCI standard, then you can plug it into the motherboard and it will work. As for how it works inside, it has been encapsulated. The Builder Pattern proposes to separate complex construction and implement it step by step. .XMLRouter separates these complex channels and performs them one by one.
Services idea: In order to communicate with Router, a unified interface must be defined when these channels are connected, which is called Services. As long as the program conforms to the Services specification, it can access the Router and route data.
Factory mode and Composite mode
XMLRouter will be generated using the Factory mode in the actual design, and the Router is generated by the RouterFactory Production will be placed in the queue when it is put into use. The corresponding Router for transmitting data, receiving data and returning data is called from the queue, and the Composite mode is applied.
IV. XML configuration file
The XML file is divided into two parts for use in Router. The first one is the configuration of Router, such as:
The following is a reference fragment:
<?xml version="1.0" ?> <services> <!-- database Service --> <service name="database" type="database" class="com.web.service.DBService"> <connector driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test" passwd="test" /> </service> <!-- Web Service--> <service name="web" type="web" class="com.web.service.WebService" > <connector /> </service> …… </services>
This is the configuration file of Router. The service node represents the channel that needs to be accessed. The service node contains connector sub-nodes. The configuration of the sub-nodes is distinguished according to type. If it is database, then Contains attributes such as url, user, passwd, driver, etc. If it is a socket, it includes attributes such as port, maxthread, etc. The attribute values can be configured according to your own definition.
Another XML file is the XML transaction data file. Used to transfer data in all services. Each Service contains a corresponding XML file. For example, the format of webtrans.xml is as follows:
The following is a reference fragment:
<?xml version="1.0" ?> <transaction> <trans name="addDoc" service="database" method="insert"> <PRoperty name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </trans> </transaction>
The corresponding dbtrans.xml format is as follows
The following is a quotation fragment:
<trans name="addDoc" table="TDOC_DOCS" method="insert"> <primarykey name="docid" /> <set> <property name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </set> </trans>
The rest of the XML can be customized according to such rules
5. Technical implementation
RouterFactory
The following is a quote:
package com.web.router; import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable;
The following is a quotation fragment:
/**
* Router产生和清除的类
*/
public class RouterFactory
{
/**
* Router存储的树front
*/
private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null;
/**
* Router存储的树back
*/
private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null;
/**
* Router存储的树
*/
private static java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null;
/**
* 返回的XMLRouter
*/
public static XMLRouter instance = null;
/**
* Router的定义
*/
public static RouterDefine routerdefine = null;
/**
* Router的ID号
*/
public static long routeIndex = 0;
/**
* @roseuid 3F169C21027C
*/
public RouterFactory()
{
}
/**
* 初始化Hashtable和Vector
*/
public static void initFactory() throws java/lang/Exception.java.html" target="_blank">Exception
{
QueuePairFront = new java/util/Hashtable.java.html" target="_blank">Hashtable();
QueuePairBack = new java/util/Hashtable.java.html" target="_blank">Hashtable();
QueueRouter = new java/util/Hashtable.java.html" target="_blank">Hashtable();
initRouteDefine();
}
/**
* 初始化Route的设置
*
*/
private static void initRouteDefine() throws java/lang/Exception.java.html" target="_blank">Exception
{
if( routerdefine == null )
routerdefine = new RouterDefine();
routerdefine.loadRouterDef();
}
/**
* 返回实例
* @return com.web.router.XMLRouter
*/
public static XMLRouter getInstance(long index) throws RouterException
{
return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index));
}
/**
* 产生一个XMLRouter的实例
* @return com.web.router.XMLRouter
* @roseuid 3F1618A103BC
*/
public static XMLRouter popInstance() throws RouterException
{
routeIndex ++;
instance = new XMLRouter(routeIndex);
setDefine( instance );
QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), instance);
return instance;
}
/**
* 清空Hashtable,Vector等
* @roseuid 3F1618B203C1
*/
private static void freeResource() throws java/lang/Exception.java.html" target="_blank">Exception
{
QueuePairFront.clear();
QueuePairBack.clear();
QueueRouter.clear();
QueuePairFront = QueuePairBack = QueueRouter = null;
}
/**
* 清除实例
* @param instanceID
* @throws Exception
*/
public static void removeInstance(XMLRouter instance) throws java/lang/Exception.java.html" target="_blank">Exception
{
instance.clear();
QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ;
}
/**
* Method isNull.
* @return boolean
*/
public static boolean isNull()
{
……
return false;
}
}
XMLRouter
The following is a quotation fragment:
package com.web.router;
import com.web.platform.Exception.RouterException;
import com.web.common.*;
import java.util.*;
import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">Method;
import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">Constructor;
/**
* @author keli
* @version 0.0.1
* 平台的关键,路由的类,每个Router将从RouterFactory里读取
* Router存储的树front,和back,routeIndex,目的是为了能在路由
* 之后可以清除申请的对象。
* Router可以实现同步和异步的功能.
*/
public class XMLRouter
{
/**
* Router存储的树front
*/
private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null;
/**
* Router存储的树back
*/
private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null;
/**
* 本router的index号码
*/
private long routeIndex = 0;
/**
* router的设置
*/
private RouterDefine define = null;
/**
* 用于判断是路由的起回点
*/
private java/lang/String.java.html" target="_blank">String action = "";
/**
*此变量只是用于在routeto方法中申请新的class
*/
private java/lang/String.java.html" target="_blank">String classname = "";
/**
*/
public XMLRouter(long index)
{
routeIndex = index;
}
/**
* 路由
* @throws Exception
* @roseuid 3F1616BD0186
*/
public void routing(Env env) throws RouterException, java/lang/Exception.java.html" target="_blank">Exception
{
/*如果为起点*/
if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) )
{
……
}
/*如果为返回点*/
else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) )
{
……
}
/*否则为错误*/
else
throw new RouterException("Set Router action error.");
}
/**
* 读取本Router的id号.
* @return long
*/
public long getIndex()
{
return routeIndex;
}
/**
* 清除所有对象.
* @throws RouterException
*/
public void clear() throws RouterException
{
QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex));
QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex));
/*系统回收*/
java/lang/System.java.html" target="_blank">System.runFinalization();
}
/**
* 设置本Router的设置.
* @param def
* @throws RouterException
*/
public void setDefine(RouterDefine def) throws RouterException
{
define = def;
}
/**
* 设置action的值
* @param actionName
* @throws RouterException
*/
public void setAction( java/lang/String.java.html" target="_blank">String actionName )
{
action = actionName;
}
}
Service class
The following is a reference fragment:
package com.web.common;
import com.web.platform.Exception.RouterException;
/**
* Service的父类,abstract
*/
public abstract class RouteService
{
/**
*/
public RouteService()
{
}
/**
* routeTo方法,是交易的起点。
* @param env
* @throws RouterException
*/
public abstract void routeto(Env env) throws RouterException;
/**
* routeBack,交易的结束点,
* @param env
* @throws RouterException
*/
public abstract void routeback(Env env) throws RouterException;
/**
* routeaccept方法,是交易的接收点,也是routeto的接收函数,
* routeaccept为被动交易对象的主要处理函数
* @param env
* @throws RouterException
*/
public abstract void routeaccept(Env env) throws RouterException;
/**
* routing方法,是Service对外的接口函数
* @throws RouterException
*/
public abstract void routing() throws RouterException;Next, you need to implement all the Services classes, which will not be introduced here.
6. Description
This Router so far It can only implement synchronous transactions and does not support asynchronous transactions for the time being. However, because the Router is designed using the Composite model, asynchronous transactions can also be expanded. I will not do a detailed analysis here.
The above is how to use it. XML realizes the content of the structure of multi-channel access to the website. For more related content, please pay attention to the PHP Chinese website (m.sbmmt.com)!
Hot AI Tools
Undress AI Tool
Undress images for free
AI Clothes Remover
Online AI tool for removing clothes from photos.
Undresser.AI Undress
AI-powered app for creating realistic nude photos
ArtGPT
AI image generator for creative art from text prompts.
Stock Market GPT
AI powered investment research for smarter decisions
Hot Article
Popular tool
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Hot Topics
20522
7
13634
4
JSON vs. XML: Why RSS Chose XML
May 05, 2025 am 12:01 AM
RSS chose XML instead of JSON because: 1) XML's structure and verification capabilities are better than JSON, which is suitable for the needs of RSS complex data structures; 2) XML was supported extensively at that time; 3) Early versions of RSS were based on XML and have become a standard.
Understanding RSS Documents: A Comprehensive Guide
May 09, 2025 am 12:15 AM
RSS documents are a simple subscription mechanism to publish content updates through XML files. 1. The RSS document structure consists of and elements and contains multiple elements. 2. Use RSS readers to subscribe to the channel and extract information by parsing XML. 3. Advanced usage includes filtering and sorting using the feedparser library. 4. Common errors include XML parsing and encoding issues. XML format and encoding need to be verified during debugging. 5. Performance optimization suggestions include cache RSS documents and asynchronous parsing.
Building XML Applications with C : Practical Examples
May 03, 2025 am 12:16 AM
You can use the TinyXML, Pugixml, or libxml2 libraries to process XML data in C. 1) Parse XML files: Use DOM or SAX methods, DOM is suitable for small files, and SAX is suitable for large files. 2) Generate XML file: convert the data structure into XML format and write to the file. Through these steps, XML data can be effectively managed and manipulated.
RSS, XML and the Modern Web: A Content Syndication Deep Dive
May 08, 2025 am 12:14 AM
RSS and XML are still important in the modern web. 1.RSS is used to publish and distribute content, and users can subscribe and get updates through the RSS reader. 2. XML is a markup language and supports data storage and exchange, and RSS files are based on XML.
XML in C : Handling Complex Data Structures
May 02, 2025 am 12:04 AM
Working with XML data structures in C can use the TinyXML or pugixml library. 1) Use the pugixml library to parse and generate XML files. 2) Handle complex nested XML elements, such as book information. 3) Optimize XML processing code, and it is recommended to use efficient libraries and streaming parsing. Through these steps, XML data can be processed efficiently.
Beyond Basics: Advanced RSS Features Enabled by XML
May 07, 2025 am 12:12 AM
RSS enables multimedia content embedding, conditional subscription, and performance and security optimization. 1) Embed multimedia content such as audio and video through tags. 2) Use XML namespace to implement conditional subscriptions, allowing subscribers to filter content based on specific conditions. 3) Optimize the performance and security of RSSFeed through CDATA section and XMLSchema to ensure stability and compliance with standards.
Understanding RSS: An XML Perspective
Apr 25, 2025 am 12:14 AM
RSS is an XML-based format used to publish frequently updated content. 1. RSSfeed organizes information through XML structure, including title, link, description, etc. 2. Creating RSSfeed requires writing in XML structure, adding metadata such as language and release date. 3. Advanced usage can include multimedia files and classified information. 4. Use XML verification tools during debugging to ensure that the required elements exist and are encoded correctly. 5. Optimizing RSSfeed can be achieved by paging, caching and keeping the structure simple. By understanding and applying this knowledge, content can be effectively managed and distributed.
Inside the RSS Document: Essential XML Tags and Attributes
May 03, 2025 am 12:12 AM
The core structure of RSS documents includes XML tags and attributes. The specific parsing and generation steps are as follows: 1. Read XML files, process and tags. 2. Extract,,, etc. tag information. 3. Handle custom tags and attributes to ensure version compatibility. 4. Use cache and asynchronous processing to optimize performance to ensure code readability.




