tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-5946530704742130970.post-61888603785399785712015-02-26T14:40:00.001+08:002023-02-25T21:30:47.901+08:00[PHP][Java][C#] 用 XSD 驗證 XML<strong>menu_config.xml</strong> 要驗證的 XML<br />
<pre class="xml:nocontrols" name="code"><?xml version="1.0" encoding="utf-8"?>
<menu_config>
<menu title="文章管理" url="~/Article" target="" allow="">
<submenu title="列表" url="~/Article/list" target="" allow=""/>
<submenu/>
<submenu title="新增" url="~/Article/add" target="" allow=""/>
</menu>
<menu/>
<menu title="帳號管理" url="~/Admin"/>
</menu_config>
</pre><br />
<br />
<strong>menu_config.xsd</strong> 結構定義<br />
<pre class="xml:nocontrols" name="code"><?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="menu_config">
<xs:complexType>
<xs:sequence>
<xs:element name="menu" type="menuType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="menuType">
<xs:sequence>
<xs:element name="submenu" type="menuType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="title" type="xs:string"/>
<xs:attribute name="url" type="xs:string"/>
<xs:attribute name="target" type="xs:string"/>
<xs:attribute name="allow" type="xs:string"/>
</xs:complexType>
</xs:schema>
</pre><dl><dt>element minOccurs</dt>
<dd>最少的出現次數,不設置為至少出現 1 次,設置 0 為可有可無。</dd>
<dt>element maxOccurs</dt>
<dd>最大的出現次數,設置 unbounded 為無上限。</dd>
<dt>attribute type</dt>
<dd>型別必須為 QName,常用的有 xs:string, xs:date, xs:int, xs:integer, xs:decimal, xs:boolean, xs:double, xs:float。</dd> </dl><br />
<br />
<strong>PHP</strong><br />
<pre class="php:nocontrols" name="code">$xmlFile = 'menu_config.xml';
$xsdFile = 'menu_config.xsd';
/* 啟用自行錯誤處裡 */
libxml_use_internal_errors(true);
$xml = new DOMDocument();
$xml->load($xmlFile);
if (!$xml->schemaValidate($xsdFile)) {
/* 顯示錯誤訊息 */
print_r(libxml_get_errors());
libxml_clear_errors();
}
</pre><br />
<br />
<strong>C#</strong><br />
<pre class="cs:nocontrols" name="code">var menuConfig = XDocument.Load("menu_config.xml");
schemas.Add("", XmlReader.Create("menu_config.xsd"));
menuConfig.Validate(schemas, (o, e) => {
e.Message.Dump();
});
</pre><br />
<br />
<strong>Java</strong><br />
<pre class="java:nocontrols" name="code">import java.io.File;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class TestXsd {
public static void main(String[] args) {
File xsd = new File("menu_config.xsd");
File xml = new File("menu_config.xml");
try {
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI
);
Schema schema = factory.newSchema(xsd);
Validator validator = schema.newValidator();
validator.validate(new StreamSource(xml));
System.out.println("xml is valid");
}
catch (SAXException|IOException e) {
System.out.println("Reason: " + e.getLocalizedMessage());
}
}
}
</pre><br />
<br />
<br />
參考資料:<br />
<a href="https://msdn.microsoft.com/zh-tw/library/ms256142(v=vs.110).aspx" target="_blank">XML 結構描述項目 - MSDN</a><br />
<a href="http://www.w3schools.com/schema/default.asp" target="_blank">XML Schema Tutorial W3Schools</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-17682424429005087692012-03-16T22:55:00.001+08:002012-03-16T22:59:04.829+08:00[PHP] 檢查 XML 文件結構利用 SimpleXML 去檢查 XML 結構是否符合規格,為了讓這個程式可以多用途,採用了一個基準文件的作為結構準則,依據裡面定義的節點跟屬性,去檢查文件是否符合基本要求的格式。<br />
<br />
<pre class="php" name="code"><?php
/**檢查 XML 文件結構
* @param string $baseFilePath 基準結構文件
* @param string $checkFilePath 待檢查文件
* @return bool 當結構與基準文件相符合時則回傳 true,否則是 false
* */
function checkXmlFileStructure($baseFilePath,$checkFilePath){
/*開啟 Base File*/
if(!file_exists($baseFilePath)){ return false; }
$base = simplexml_load_file($baseFilePath);
if($base===false){ return false; }
/*開啟 Check File*/
if(!file_exists($checkFilePath)){ return false; }
$check = simplexml_load_file($checkFilePath);
if($check===false){ return false; }
/*比較起始點的名稱*/
if($base->getName() != $check->getName()){ return false; }
/*比較結構*/
return checkXmlStructure($base,$check);
}
/**檢查 XML 結構
* @param SimpleXMLElement $base 基準結構物件
* @param SimpleXMLElement $check 待檢查 XML 物件
* @return bool 當結構與基準物件相符合時則回傳 true,否則是 false
* */
function checkXmlStructure($base,$check){
/*檢查屬性*/
foreach ($base->attributes() as $name => $baseAttr){
/*必要的屬性不存在*/
if(!isset($check->attributes()->$name)){ return false; }
}
/*當沒有子節點時,則檢查對象也不能有子節點*/
if(count($base->children())==0){
return (count($check->children())==0);
}
/*將檢查對象的子節點分群*/
$checkChilds = array();
foreach($check->children() as $name => $child){
$checkChilds[$name][] = $child;
}
/*檢查子節點*/
$checked = array();
foreach($base->children() as $name => $baseChild){
/*跳過已經檢查的子節點*/
if(in_array($name, $checked)){ continue; }
$checked[] = $name;
/*檢查必要的子節點是否存在*/
if(empty($checkChilds[$name])){ return false; }
foreach ($checkChilds[$name] as $child){
/*遞迴檢查子節點*/
if( !checkXmlStructure($baseChild, $child) ){ return false; }
}
}
return true;
}
/*==============================================================================*/
if(isset($_SERVER['argv'])){
parse_str(preg_replace('/&[\-]+/','&',join('&',$_SERVER['argv'])), $_GET);
if(empty($_GET['base_file']) || empty($_GET['check_file'])){
echo "Run: ".basename(__FILE__)." base_file=base.xml check_file=check.xml\n"; exit(1);
}
exit( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? 0 : 1);
}else{
if(empty($_GET['base_file']) || empty($_GET['check_file'])){
echo "Run: ".basename(__FILE__)."?base_file=base.xml&check_file=check.xml<br />"; exit;
}
echo( checkXmlFileStructure($_GET['base_file'],$_GET['check_file']) ? '1' : '0');
}
</pre><br />
<br />
<strong>使用方式(shell)</strong><br />
<pre class="sh" name="code">php check_xml_file_structure.php base_file=base.xml check_file=check.xml
if [ "j$?" != "j0" ]; then
echo "Run Error"
fi
</pre><br />
<br />
<strong>測試範例 1</strong><br />
base_1.xml<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<Category>Category文字</Category>
<Title>Title文字</Title>
</item>
</items>
</pre><br />
check_1.xml<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<Category>Category文字</Category>
<Title>Title文字</Title>
</item>
<item>
<Category>Category文字</Category>
<Title>Title文字</Title>
<Description>Description文字</Description>
</item>
</items>
</pre><br />
<br />
<strong>測試範例 2</strong><br />
base_2.xml<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<items>
<item category="Category文字" Title="Title文字"/>
</items>
</pre><br />
check_2.xml<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="UTF-8"?>
<items>
<item category="Category文字" Title="Title文字" Description="Description文字" />
<item category="Category文字" Title="Title文字" />
<item category="Category文字" Title="Title文字" Description="Description文字" />
</items>
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-39865778807319570452012-02-01T14:05:00.003+08:002013-06-10T22:41:55.222+08:00[PHP] 用 SoapServer 建立 Microsoft Office Research Service這裡我用 <a target="_blank" href="http://www.jool.nl/jool-tech-zone/webservice-helper/download/">Webservice Helper</a> 來處理 WSDL 的問題,所以範例也是 Base 在 <a target="_blank" href="http://www.jool.nl/jool-tech-zone/webservice-helper/download/">Webservice Helper</a> 上面,在開始前請檢查是否有 <b>php_soap</b> 與 <b>php_xsl</b> 這兩個套件。<br />
<br />
<br />
為了相容於 Research Service 的名稱空間,在輸出入的定義上需要在包一層資料類型,所以需要以下的類型定義:<br />
StatusResponse.class.php<br />
<pre class="php" name="code"><?php
/**
* Return object to Status method
*/
class StatusResponse {
/** @var string */
public $StatusResult;
}
</pre><br />
Registration.class.php<br />
<pre class="php" name="code"><?php
/**
* Input object to Registration method
*/
class Registration {
/** @var string */
public $registrationXml;
}
</pre><br />
RegistrationResponse.class.php<br />
<pre class="php" name="code"><?php
/**
* Return object to Registration method
*/
class RegistrationResponse {
/** @var string */
public $RegistrationResult;
}
</pre><br />
Query.class.php<br />
<pre class="php" name="code"><?php
/**
* Input object to Query method
*/
class Query {
/** @var string */
public $queryXml;
}
</pre><br />
QueryResponse.class.php<br />
<pre class="php" name="code"><?php
/**
* Return object to Query method
*/
class QueryResponse {
/** @var string */
public $QueryResult;
}
</pre><br />
<br />
接著是建立 Web Service 的 Method,主要定義 Registration 跟 Query 這兩個 Method 就可以了,Registration 是用在新增 Research Service 到 Research Pane 時會呼叫的 Method,主要是提供 Research Pane 所需要的 Service 資訊。<br />
而 Query 則是真正再處理資料查詢的 Method,而 QueryResponse 中的 domain 及 QueryId 必需與 QueryXml 中所給的相同,不然 Client 端會無法辨識回傳結果。 <br />
<pre class="php" name="code"><?php
/**
* Microsoft Office Research Service
*
*/
class MsOfficeResearch {
/**
* Entry point to test if server is alive. Will return 'ONLINE' or 'OFFLINE'
* @param void
* @return StatusResponse
*/
function Status() {
$result = new StatusResponse;
$result->StatusResult = 'ONLINE';
return $result;
}
/**
* Basic registration entry point
* @param Registration $registrationXml
* @return RegistrationResponse
*/
public function Registration($registrationXml) {
// debugDump('registrationXml: '.$request->registrationXml);
$dom = new DOMDocument();
$proUpdate = $dom->createElementNS("urn:Microsoft.Search.Registration.Response",'ProviderUpdate');
$proUpdate->appendChild( new DOMElement('Status',"SUCCESS") );
$providers = $proUpdate->appendChild( new DOMElement('Providers') );
$provider = $providers->appendChild( new DOMElement('Provider') );
$provider->appendChild( new DOMElement('Id',"{62E1D68D-E1C4-4CC5-9D0C-D4B7999C4B77}") );
$provider->appendChild( new DOMElement('Name',"Research Service") );
$provider->appendChild( new DOMElement('QueryPath',"http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']) );
$provider->appendChild( new DOMElement('RegistrationPath',"http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']) );
$provider->appendChild( new DOMElement('Type',"SOAP") );
$provider->appendChild( new DOMElement('Revision',"1") );
$services = $provider->appendChild( new DOMElement('Services') );
$service = $services->appendChild( new DOMElement('Service') );
$service->appendChild( new DOMElement('Id',"{0297CD20-047F-4256-0104-000004040001}") );
$service->appendChild( new DOMElement('Name',"Research Service Name") );
$service->appendChild( new DOMElement('Description',"Research Service Description") );
$service->appendChild( new DOMElement('Copyright',"") );
$service->appendChild( new DOMElement('Display',"On") );
$service->appendChild( new DOMElement('Category',"RESEARCH_GENERAL") );
$response = new RegistrationResponse;
$response->RegistrationResult = $dom->saveXML($proUpdate);
return $response;
}
/**
* Basic entrypoint for Query
* @param Query $queryXml
* @return QueryResponse
*/
function Query($queryXml) {
if(is_object($queryXml)){ $queryXml = $queryXml->queryXml; }
// debugDump('queryXml: '.$queryXml);
/*解析請求的 XML*/
$dom = new DOMDocument();
$dom->loadXML($queryXml);
$domain = $dom->getElementsByTagName('Query')->item(0)->getAttribute('domain');
$queryId = $dom->getElementsByTagName('QueryId')->item(0)->nodeValue;
/*建立返回的結構*/
$packet = $dom->createElementNS("urn:Microsoft.Search.Response",'ResponsePacket');
$packet->setAttribute('revision',"1");
$response = $packet->appendChild( new DOMElement('Response') );
$response->setAttribute('domain', $domain );
$response->appendChild( new DOMElement('QueryId', $queryId) );
$range = $response->appendChild( new DOMElement('Range') );
$results = $range->appendChild( new DOMElement('Results') );
$content = $results->appendChild( new DOMElement('Content',"","urn:Microsoft.Search.Response.Content") );
/*請求查詢*/
$status = "ERROR_NO_RESULTS_FOUND";
$queryText = trim( $dom->getElementsByTagName('QueryText')->item(0)->nodeValue );
if(!empty($queryText)){
// debugDump($queryText);
$line = $content->appendChild( new DOMElement('P') );
$line->nodeValue = htmlspecialchars($queryText, ENT_QUOTES);
$status = "SUCCESS";
}
$response->appendChild( new DOMElement('Status',$status) );
/*設定回傳結構*/
$response = new QueryResponse;
$response->QueryResult = $dom->saveXML($packet);
return $response;
}
}
</pre><br />
<br />
關於資料交換的 XML 格式如下:<br />
Registration Response XML<br />
<pre class="xml" name="code"><ProviderUpdate xmlns='urn:Microsoft.Search.Registration.Response'>
<Status>SUCCESS</Status>
<Providers><Provider>
<Id>{88686849-2DD9-474d-9300-778E3336FA77}</Id>
<Name>EpgTools</Name>
<QueryPath>http://localhost/service.php</QueryPath>
<RegistrationPath>http://localhost/service.php</RegistrationPath>
<Type>SOAP</Type>
<Revision>1</Revision>
<Services><Service>
<Id>63d351db-d12e-448b-8541-9f794e1ec977</Id>
<Name>Research Service Name</Name>
<Data>1031/1033/4</Data>
<Description>Research Service Description</Description>
<AboutPath>helpId:553713956</AboutPath>
<Copyright>All content Copyright (c) 2003.</Copyright>
<Display>On</Display>
<Category>RESEARCH_GENERAL</Category>
<OptionsPath></OptionsPath>
<Parental>Unsupported</Parental>
</Service></Services>
</Provider></Providers>
</ProviderUpdate>
</pre><br />
Query XML<br />
<pre class="xml" name="code"><QueryPacket xmlns="urn:Microsoft.Search.Query" revision="1" build="(11.0.5606)">
<Query domain="{6E3B8AA1-5131-403E-AEF3-E7AFC2E88557}">
<QueryId>{5A4FD162-DB71-45BC-8721-F059D28947B3}</QueryId>
<OriginatorId>{F6FF7BE0-F39C-4ddc-A7D0-09A4C6C647A5}</OriginatorId>
<SupportedFormats>
<Format revision="1">urn:Microsoft.Search.Response.Document:Document</Format>
<Format revision="1">urn:Microsoft.Search.Response.Content:Content</Format>
<Format revision="1">urn:Microsoft.Search.Response.Form:Form</Format>
</SupportedFormats>
<Context>
<QueryText type="STRING" language="zh-tw">test</QueryText>
<LanguagePreference>zh-tw</LanguagePreference>
<Requery></Requery>
</Context>
<Range id="result"></Range>
<OfficeContext xmlns="urn:Microsoft.Search.Query.Office.Context" revision="1">
<UserPreferences>
<ParentalControl>false</ParentalControl>
</UserPreferences>
<ServiceData>EWATW</ServiceData>
<ApplicationContext>
<Name>Microsoft Office</Name>
<Version>(11.0.5606)</Version>
<SystemInformation>
<SkuLanguage>zh-tw</SkuLanguage>
<LanguagePack>zh-tw</LanguagePack>
<InterfaceLanguage>zh-tw</InterfaceLanguage>
<Location>TW</Location>
</SystemInformation>
</ApplicationContext>
<QueryLanguage>zh-tw</QueryLanguage>
<KeyboardLanguage>zh-tw</KeyboardLanguage>
</OfficeContext>
<Keywords xmlns="urn:Microsoft.Search.Query.Office.Keywords" revision="1">
<QueryText>test</QueryText>
<Keyword>
<Word>test</Word>
</Keyword>
</Keywords>
</Query>
</QueryPacket>
</pre><br />
Query Response XML<br />
<pre class="xml" name="code"><ResponsePacket xmlns="urn:Microsoft.Search.Response" revision="1">
<Response domain="{6e3b8aa1-5131-403e-aef3-e7afc2e88557}">
<QueryId>{5A4FD162-DB71-45BC-8721-F059D28947B3}</QueryId>
<Range><Results>
<Content xmlns="urn:Microsoft.Search.Response.Content">
<any />
</Content>
</Results></Range>
<Status>SUCCESS</Status>
</Response>
</ResponsePacket>
</pre><br />
<br />
範例下載:<br />
<a target="_blank" href="http://sites.google.com/site/weskerjax/code-demo/SearchService.zip">SearchService.zip</a><br />
<br />
<br />
參考資料:<br />
<a target="_blank" href="http://blog.touv.fr/2006/08/serveur-soap-en-php-5-pour-office.html">Serveur SOAP en PHP 5 pour "Microsoft Office Research Service" </a><br />
<a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb226691%28v=office.11%29.aspx">The Definitive Hello World Custom Research Service Tutorial</a><br />
<a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa193743%28v=office.11%29.aspx">Microsoft.Search.Response.Content Schema Documentation</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-11608797341483273992010-10-07T18:04:00.002+08:002012-03-16T22:58:01.090+08:00讓 Eclipse Task tag 能用在任何文件類型上之前為了找能夠在 SQL File 中使用 Task tag 套件花了不少時間,最後發現 Mylyn 的套件中有一個針對所有專案下 DTD 跟 XML 的 Task tag 功能,索性利用這個功能讓 SQL 也支援 Task tag。<br /><br />因為這個功能只支援 XML 格式的註解 <!-- 至 -->,所以只要巧妙的利用這個特性就可以達到我們要的功能。<br /><br /><br />首先在『<strong style="color: rgb(255, 0, 0);">內容類型 → DTD</strong>』中加入 *.sql 。<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHirNqJoJthvU20ENG1juz3AbcGjW9nnXHAmCjHo3f3d1Zuc97KU9PE0oNE7RGmHKKzDE1KD_3G6OCGx0hy62X3XeRBGEsIbU6_ySSHvVdUMi8NRpkVhbkvFgHq-ZiBzps7coq5OJny_RP/s1600-h/eclipse-task-tag-01.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHirNqJoJthvU20ENG1juz3AbcGjW9nnXHAmCjHo3f3d1Zuc97KU9PE0oNE7RGmHKKzDE1KD_3G6OCGx0hy62X3XeRBGEsIbU6_ySSHvVdUMi8NRpkVhbkvFgHq-ZiBzps7coq5OJny_RP/s256/eclipse-task-tag-01.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119782964222338" border="0" /></a><br /><br /><br />再來在 SQL file 的起始處加入 <strong style="color: rgb(255, 0, 0);">-- <!--</strong> 。<br /><a href="http://lh3.ggpht.com/_b8lN_UbLoEc/TKmds4GqBsI/AAAAAAAAH1E/8tjULFEKFfg/s1600-h/eclipse-task-tag-02.jpg"><img src="http://lh3.ggpht.com/_b8lN_UbLoEc/TKmds4GqBsI/AAAAAAAAH1E/8tjULFEKFfg/s256/eclipse-task-tag-02.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119812246734530" border="0" /></a><br /><br /><br />在結尾處加上 <strong style="color: rgb(255, 0, 0);">-- --> </strong>。<br /><a href="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdsDwmRxI/AAAAAAAAH1A/SsBMrPv8854/s1600-h/eclipse-task-tag-03.jpg"><img src="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdsDwmRxI/AAAAAAAAH1A/SsBMrPv8854/s256/eclipse-task-tag-03.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119798195570450" border="0" /></a><br /><br /><br />開啟『<strong style="color: rgb(255, 0, 0);">專案 → 內容</strong>』啟用 Task Tags,並將 『Filters』中的 XML 取消。<br /><a href="http://lh5.ggpht.com/_b8lN_UbLoEc/TKmdqrdxThI/AAAAAAAAH04/o4WxfiG1wEQ/s1600-h/eclipse-task-tag-04.jpg"><img src="http://lh5.ggpht.com/_b8lN_UbLoEc/TKmdqrdxThI/AAAAAAAAH04/o4WxfiG1wEQ/s256/eclipse-task-tag-04.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119774494281234" border="0" /></a><br /><br /><br />我希望可以標出所有資料表的定義,所以在這裡我加入 TABLE 這個關鍵字。<br /><a href="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdqHVq2jI/AAAAAAAAH00/5OtMf1PkXEQ/s1600-h/eclipse-task-tag-05.jpg"><img src="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdqHVq2jI/AAAAAAAAH00/5OtMf1PkXEQ/s256/eclipse-task-tag-05.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119764796627506" border="0" /></a><br /><br /><br />接著就可以看到很快樂的結果了。<br /><a href="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdpmncv7I/AAAAAAAAH0w/ENWLud68QVw/s1600-h/eclipse-task-tag-06.jpg"><img src="http://lh4.ggpht.com/_b8lN_UbLoEc/TKmdpmncv7I/AAAAAAAAH0w/ENWLud68QVw/s256/eclipse-task-tag-06.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119756012830642" border="0" /></a><br /><br /><br />當然在 Task View 中也會列出所有的標記。<br /><a href="http://lh3.ggpht.com/_b8lN_UbLoEc/TKmdpM_hS4I/AAAAAAAAH0s/iZHKPAh1x4Q/s1600-h/eclipse-task-tag-07.jpg"><img src="http://lh3.ggpht.com/_b8lN_UbLoEc/TKmdpM_hS4I/AAAAAAAAH0s/iZHKPAh1x4Q/s256/eclipse-task-tag-07.jpg" alt="" id="BLOGGER_PHOTO_ID_5524119749134470018" border="0" /></a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-65306280509699901872010-07-16T17:29:00.011+08:002013-06-10T23:27:44.922+08:00[PHP] 取得 Weather Underground 即時氣象如果你需要即時的氣象資訊,找 <a target="_blank" href="http://api.wunderground.com/">Weather Underground</a> 是一個不錯的選擇,每30分鐘更新一次,再加上提供很方便 XML 資料連結,唯一感到美中不足的就是沒有多國語言的支持。<br />
<br />
<pre class="php" name="code"><?php
// ?query=[觀測點名稱],例如: Taoyuan Air Base , Taipei
$xml = simplexml_load_file(
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=RCSS"
);
// 氣象圖示
foreach ($xml->icons->children() as $icon_set) {
if($icon_set['name']=='Contemporary'){
echo $icon_set->icon_url;
}
}
/*
圖示造型種類:
Default
Smiley
Helen
Generic
Old School
Cartoon
Mobile
Simple
Contemporary
Dunkin' Donuts
*/
echo "氣象狀況:",$xml->weather,"\n";
echo "溫度:",$xml->temp_c,"°C\n";
echo "相對濕度:",$xml->relative_humidity,"\n";
echo "風向:",$xml->wind_dir,"\n";
echo "風速:",$xml->wind_mph,"MPH\n";
echo "風速:每小時",round($xml->wind_mph*1.6093),"公里\n";
echo "風速:每秒",round($xml->wind_mph*0.447028),"公尺\n";
echo "海平面氣壓:",$xml->pressure_mb,"百帕\n";
echo "高溫指數:",$xml->heat_index_c,"°C\n";
echo "風寒指數:",$xml->windchill_c,"°C\n";
echo "水凝點:",$xml->dewpoint_c,"°C\n";
echo "能見度:",$xml->visibility_km,"公里\n";
echo "觀測時間:",date(
'Y-m-d H:i',
strtotime($xml->observation_time_rfc822)
),"\n";
/*
thunderstorm rain = 雷雨
showers rain = 驟雨
light showers rain = 小驟雨
Cloudy = 多雲
Flurries = 小雪
Fog = 霧
Haze = 陰霾
Mostly Cloudy = 多雲時陰
Mostly Sunny = 晴時多雲
Partly Cloudy = 局部多雲
Partly Sunny = 多雲時晴
Freezing Rain = 凍雨
Rain = 雨
Sleet = 冰雹
Snow = 雪
Sunny = 晴朗
Unknown = 未知
Overcast = 陰天
Scattered Clouds = 疏雲
*/
</pre><br />
<br />
參考資料:<br />
<a target="_blank" href="http://api.wunderground.com/global/TW.html">台灣各地-氣象觀測點</a><br />
<a target="_blank" href="http://wiki.wunderground.com/index.php/API_-_XML">API - XML - WunderWiki</a><br />
<br />
<a target="_blank" href="http://php.net/manual/en/function.simplexml-load-file.php">PHP: simplexml_load_file - Manual</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com1tag:blogger.com,1999:blog-5946530704742130970.post-10276631702224773072010-05-03T14:40:00.004+08:002012-03-16T22:58:01.086+08:00[ActionScript] 讀取 XML 資料格式<span style="font-weight:bold;">1.資料欄位以子節點方式載入與解析</span><br /><pre class="xml" name="code"><br /><!-- load_1.xml --><br /><?xml version="1.0" encoding="UTF-8"?><br /><xmltest><br /> <parentnode><br /> <id>1</id><br /> <name>小明</name><br /> <date>2010-10-10</date><br /> </parentnode><br /> <parentnode><br /> <id>2</id><br /> <name>小王</name><br /> <date>2010-5-15</date><br /> </parentnode><br /></xmltest><br /></pre><br /><pre class="js" name="code"><br />/*建立 XML()*/<br />LoadXml_1 = new XML();<br /><br />/*捨棄只包含空白字元的文字節點*/<br />LoadXml_1.ignoreWhite=true;<br /><br />/*載入完成時所執行的程式*/<br />LoadXml_1.onLoad = function(){<br /> articleList = this.firstChild.childNodes;<br /> var txt = "";<br /> for (i=0; i<articleList.length; i++) {<br /> elementList = articleList[i].childNodes;<br /> for (j=0; j<elementList.length; j++) {<br /> elementTag = elementList[j];<br /> switch(elementTag.nodeName){<br /> case "id":<br /> txt += elementTag.firstChild.nodeValue+',';<br /> break;<br /> case "name":<br /> txt += elementTag.firstChild.nodeValue+',';<br /> break;<br /> case "date":<br /> txt += elementTag.firstChild.nodeValue+',';<br /> break;<br /> }<br /> }<br /> txt += '\n';<br /> }<br /><br /> trace(txt); /*顯示載入的資料*/<br />}<br /><br />/*開始載入 load_1.xml*/<br />LoadXml_1.load("load_1.xml");<br /></pre><br /><br /><br /><span style="font-weight:bold;">2.資料欄位以屬性方式載入與解析</span><br /><pre class="xml" name="code"><br /><!-- load_2.xml --><br /><?xml version="1.0" encoding="utf-8"?><br /><xmltest><br /> <parentnode id="1" name="小明" date="2010-10-10" /><br /> <parentnode id="2" name="小王" date="2010-5-15" /><br /></xmltest><br /></pre><br /><pre class="js" name="code"><br />/*建立 XML()*/<br />LoadXml_2 = new XML();<br /><br />/*捨棄只包含空白字元的文字節點*/<br />LoadXml_2.ignoreWhite=true;<br /><br />/*載入完成時所執行的程式*/<br />LoadXml_2.onLoad = function(success) {<br /> var articleList = this.firstChild.childNodes;<br /> var txt = "";<br /> for (i=0; i<articleList.length; i++){<br /> txt += articleList[i].attributes.id+','<br /> +articleList[i].attributes.name+','<br /> +articleList[i].attributes.call+','<br /> +articleList[i].attributes.channel+"\n";<br /> }<br /> <br /> trace(txt);/*顯示載入的資料*/<br />};<br /><br />/*開始載入 load_2.xml*/<br />LoadXml_2.load("load_2.xml");<br /></pre><br /><br /><br /><br />參考資料:<br /><a href="http://help.adobe.com/zh_TW/AS2LCR/Flash_10.0/help.html?content=00001712.html">Flash CS4 Professional ActionScript 2.0 - XML</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-62710646113597472132010-01-26T22:12:00.002+08:002013-06-11T22:10:51.501+08:00[JavaScript] 解析 XML 字串(IE / FF)<pre class="js" name="code">String.prototype.toXmlDom=function(){
var dom=null;
if (window.DOMParser){
dom = (new DOMParser()).parseFromString(this, "text/xml");
}else{
dom=new ActiveXObject("microsoft.XMLDOM");
dom.async=false;
dom.loadXML(this);
}
return dom;
}
xmlDom = xmlStr.toXmlDom();
</pre><br />
<br />
我做了一些測試,在 Firefox 中就像一般的 DOM Element 一樣操作就可以了。<br />
<br />
但在 IE 中所解析出來的 XML 是以 Object 的方式處理,只能使用 IE 所提供的方法操作,而且有些 tag node 會無法取得,如 <date>。<br />
<br />
參考來源:<br />
<a target="_blank" href="http://atim.cn/read.php/289.htm">javascript读取xml(firefox与ie兼容)</a><br />
<a target="_blank" href="http://www.w3schools.com/Dom/dom_parser.asp">XML DOM Parser</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-83092925809640622332009-12-21T15:11:00.009+08:002012-03-16T22:58:01.081+08:00Blogger 文章匯入的格式Blogger 可以接受 <a href="http://www.w3.org/2005/Atom">Atom</a> 的格式匯入<br />至於 RSS 的格式就要去找轉換器轉成 <a href="http://www.w3.org/2005/Atom">Atom</a> 才可以匯入<br /><br />以下是 Blogeer 匯入時的最簡化的格式<br /><pre class="xml" name="code"><br /><?xml version='1.0' encoding='UTF-8'?><br /><?xml-stylesheet <br /> href="http://www.blogger.com/styles/atom.css" <br /> type="text/css"?<br />><br /><feed xmlns='http://www.w3.org/2005/Atom' <br /> xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' <br /> xmlns:georss='http://www.georss.org/georss'<br />><br /> <id>tag:blogger.com,1999:blog-4</id><br /> <generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><br /><br /> <entry><br /> <id>tag:blogger.com,1999:blog-4.post-2</id><br /> <published>2009-12-19T23:39:20.281+08:00</published><br /> <title type='text'>標題</title><br /> <content type='html'>文章內容</content><br /> <category scheme='http://www.blogger.com/atom/ns#' term='標籤1'/><br /> <category scheme='http://www.blogger.com/atom/ns#' term='標籤2'/><br /> </entry><br /><br /> <entry><br /> <id>tag:blogger.com,1999:blog-4.post-2</id><br /> <published>2009-12-19T23:39:20.281+08:00</published><br /> <title type='text'>標題</title><br /> <content type='html'>文章內容</content><br /> <category scheme='http://www.blogger.com/atom/ns#' term='標籤1'/><br /> <category scheme='http://www.blogger.com/atom/ns#' term='標籤2'/><br /> </entry><br /><br /></feed><br /></pre><ul><li><strong>generator</strong>:產生器識別,Blogger 只接受自己的標示</li><li><strong>id</strong>:可以重複,但必須符合格式</li><li><strong>published</strong>:發佈時間,格式為 ISO8601</li><li><strong>title</strong>:文章標題</li><li><strong>content</strong>:文章內文,可以允許換行符號"\n",內文的 HTML 必須實體逸出</li><li><strong>category</strong>:標籤<br /></li></ul>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-8279857905236027052009-03-29T08:09:00.012+08:002012-03-16T22:58:01.076+08:00iGoogle 小工具製作心得iGoogle 小工具主要是以 XML 為主體,再加上 HTML、CSS 及 JavaScript 所組成的,基本上只要會後面三種語言,要開發 iGoogle 小工具是非常快樂的一件事。<br /><br />在這裡我只做一些的教學及心得分享,詳細的規範及 API 說明,請察看官方網站 <a href="http://www.google.com.tw/intl/zh-TW/apis/gadgets/docs-home.html">Google 小工具 API 開發人員指南</a>,開發指南裡面寫的很清楚,還有很多的範例可以參考。<br /><br />心得建議:<br /><ul><li>再<span style="color: rgb(255, 0, 0); font-weight: bold;">開發時</span>建議 XML 的<span style="color: rgb(255, 0, 0); font-weight: bold;">檔名不要太正式</span>,iGoogle 的平台會 cache XML,造成檢視上會出現不一致情況,等到要發佈時再取一個正式的檔名,避免不必要的問題發生。</li><li>如果要使用 session 和 cookie 做登入驗證的話,最好使用 <span style="color: rgb(255, 0, 0); font-weight: bold;"><iframe></span> 去處理,會比較容易達成且安全問題也比較少。</li><li>在 ModulePrefs 中的 category 屬性也記得加上去,在官方的開發人員指南中並沒有說明,共有:<br /><ul><li>politics</li></ul><ul><li>tools</li></ul><ul><li>funandgames</li></ul><ul><li>lifestyle</li></ul><ul><li>finance</li></ul><ul><li>communication<br /></li></ul><ul><li>等...。</li></ul></li><br /><li>多利用[<a href="http://www.google.com.tw/intl/zh-TW/apis/gadgets/gs.html#Scratchpad">便條簿</a>]做測試可以減少不少時間。<br /></li><li>在<span style="color: rgb(255, 0, 0); font-weight: bold;">測試時</span>最好在 iGoogle 上另開一個[<span style="color: rgb(255, 0, 0); font-weight: bold;">分頁</span>],免得自己原本常用的小工具被打亂。<br /></li><li>在測試的[分頁]中最好加上[<a href="http://fusion.google.com/add?moduleurl=developer.xml">開發人員小工具</a>]這個小工具去管理 cache 問題。<br /></li></ul><br />小工具範例:<br /><pre class="xml" name="code"><br /><?xml version="1.0" encoding="UTF-8" ?><br /><Module><br /> <ModulePrefs<br /> title="單位換算"<br /> description="更方便的介面處理單位制度上的換算"<br /> directory_title="單位換算"<br /> author="Jax"<br /> author_email="weskerjax+feed@gmail.com"<br /> thumbnail=<br /> "http://weskerjax.googlepages.com/unit_converter_thumbnail.png"<br /> screenshot=<br /> "http://weskerjax.googlepages.com/unit_converter_screenshot.png"<br /> title_url="http://jax-work-archive.blogspot.com/"<br /> category="tools"<br /> height="300"><br /> <Locale lang="zh-tw" country="TW"/><br /> <Require feature="tabs"/><br /> <Require feature="dynamic-height"/><br /> </ModulePrefs><br /> <UserPref<br /> name="type"<br /> display_name="預設開啟的頁籤"<br /> default_value="長度"<br /> datatype="enum"><br /> <EnumValue value="長度"/><br /> <EnumValue value="重量"/><br /> <EnumValue value="面積"/><br /> <EnumValue value="體積"/><br /> </UserPref><br /> <Content type="html"><br /> <![CDATA[<br /><style type="text/css"><br />.JContent table{<br /> margin-top:5px;<br /> width:100%;<br />}<br />.JContent th{<br /> background-color:#99CCFF;<br /> padding-top:5px;<br />}<br />.JContent label{<br /> text-align:center;<br /> padding:3px;<br /> display:block;<br /> font-size:12px;<br />}<br />.JContent label input{<br /> display:block;<br /> text-align:left;<br /> line-height:1.1em;<br /> font-size:11px;<br /> width:95%;<br />}<br /></style><br /><script type="text/javascript"><br />var prefs = new _IG_Prefs(__MODULE_ID__);<br />function set_event__MODULE_ID__(tabId){<br /> var inputs=_gel(tabId).getElementsByTagName('input');<br /> for (var i=0, j=inputs.length; i<j; i++){<br /> el=inputs[i];<br /> /*設定 onkeyup 時處理單位換算*/<br /> el.onkeyup=function(){<br /> this.value=this.value.match(/[0-9]+[\.]?[0-9]*/);<br /> var rate=this.getAttribute('rate');<br /> var value=parseFloat(this.value)/parseFloat(rate);<br /><br /> var table=this;<br /> while(table.tagName!="TABLE"){table=table.parentNode;}<br /><br /> var inputs=table.getElementsByTagName('input');<br /> for (var i=0, j=inputs.length; i<j; i++){<br /> chg=inputs[i];<br /> r=chg.getAttribute('rate');<br /> if(r==rate){continue;}<br /><br /> if(this.value){chg.value=value*parseFloat(r);}<br /> else{chg.value='';}<br /> };<br /> };<br /> /*設定 onfocus 選取所有文字*/<br /> el.onfocus=function(){this.select()};<br /> };<br /> /*讓小工具能夠自行調整大小*/<br /> _IG_AdjustIFrameHeight();<br />}<br />function init() {<br /> /*建立頁籤並選定預選頁籤*/<br /> var tabs = new _IG_Tabs(__MODULE_ID__,prefs.getString("type"));<br /> tabs.addTab("長度","J_length",set_event__MODULE_ID__);<br /> tabs.addTab("重量","J_weight",set_event__MODULE_ID__);<br /> tabs.addTab("面積","J_area",set_event__MODULE_ID__);<br /> tabs.addTab("體積","J_volume",set_event__MODULE_ID__);<br />}<br />_IG_RegisterOnloadHandler(init);/*載入時呼叫的事件處理常式*/<br /></script><br /><div class="JContent" id="J_length"><br /> <table border="1" cellspacing="0" cellpadding="0"><br /> <tr><br /> <td><label>公尺<input rate="1" type="text" /></label></td><br /> <td><label>公里<input rate="0.001" type="text" /></label></td><br /> <td><label>海里<input rate="0.00053996" type="text" /></label></td><br /> <tr><br /> <td><label>英吋<input rate="39.370" type="text" /></label></td><br /> <td><label>英呎<input rate="3.2808" type="text" /></label></td><br /> <td><label>英碼<input rate="1.0936" type="text" /></label></td><br /> </tr><br /> <td><label>台尺<input rate="3.3003" type="text" /></label></td><br /> <td><label>市里<input rate="2e-3" type="text" /></label></td><br /> <td><label>市引<input rate="0.03" type="text" /></label></td><br /> </tr><br /> </table><br /></div><br /><div class="JContent" id="J_weight"><br /> <table border="1" cellspacing="0" cellpadding="0"><br /> <tr><br /> <td><label>公斤<input rate="1" type="text" /></label></td><br /> <td><label>公克<input rate="1e+3" type="text" /></label></td><br /> <td><label>公噸<input rate="1e-3" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>英磅<input rate="2.2046" type="text" /></label></td><br /> <td><label>盎司<input rate="35.273" type="text" /></label></td><br /> <td><label>英噸<input rate="9.8421e-4" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>美噸<input rate="0.0011023" type="text" /></label></td><br /> <td><label>格令<input rate="15432" type="text" /></label></td><br /> <td><label>克拉<input rate="5000" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>台斤<input rate="1.6667" type="text" /></label></td><br /> <td><label>台兩<input rate="26.667" type="text" /></label></td><br /> <td><label>市擔<input rate="0.02" type="text" /></label></td><br /> </tr><br /> </table><br /></div><br /><div class="JContent" id="J_area"><br /> <table border="1" cellspacing="0" cellpadding="0"><br /> <tr><br /> <td><label>公畝<input rate="100.00" type="text" /></label></td><br /> <td><label>公頃<input rate="1" type="text" /></label></td><br /> <td><label>平方公里<input rate="0.01" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>平方英寸<input rate="155e+5" type="text" /></label></td><br /> <td><label>平方英尺<input rate="107640" type="text" /></label></td><br /> <td><label>平方碼<input rate="11960" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>英畝<input rate="2.4711" type="text" /></label></td><br /> <td><label>平方英里<input rate="0.003861" type="text" /></label></td><br /> <td> </td><br /> </tr><br /> </table><br /></div><br /><div class="JContent" id="J_volume"><br /> <table border="1" cellspacing="0" cellpadding="0"><br /> <tr><br /> <td><label>立方公尺<input rate="1" type="text" /></label></td><br /> <td><label>公升<input rate="1e+3" type="text" /></label></td><br /> <td><label>毫升<input rate="1e+6" type="text" /></label></td><br /> </tr><br /> <tr><br /> <td><label>英國加侖<input rate="219.97" type="text" /></label></td><br /> <td><label>液體加侖<input rate="264.17" type="text" /></label></td><br /> <td><label>固體加侖<input rate="227.02" type="text" /></label></td><br /> </tr><br /> </table><br /></div><br /> ]]><br /> </Content><br /></Module><br /></pre><br /><br />範例預覽:<br /><script src="http://www.gmodules.com/ig/ifr?url=http://weskerjax.googlepages.com/unit_converter.xml&up_type=%E9%87%8D%E9%87%8F&synd=open&w=420&h=410&title=%E5%96%AE%E4%BD%8D%E6%8F%9B%E7%AE%97&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script><br />範例原始檔:<a target="_blank" href="http://weskerjax.googlepages.com/unit_converter.xml">unit_converter.xml</a><br /><br /><br />第一個開發的小工具:<br /><script src="http://www.gmodules.com/ig/ifr?url=http://www.wacanai.com/google_tool/wacanai_mini_0902.xml&up_list_row=5&synd=open&w=420&h=300&title=Wacanai+Mini+v0.5+for+iGoogle&lang=zh-TW&country=TW&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-74656917406798324022009-03-04T21:52:00.011+08:002013-06-11T21:33:16.266+08:00製作 sitemap 的心得最近在為網站製作 sitemap 產生器,花了半小時去看 <a target="_blank" href="http://www.sitemaps.org/zh_TW/protocol.php">sitemaps.org - 通訊協定</a>,這跟 <a target="_blank" href="https://www.google.com/webmasters/tools/docs/zh_TW/protocol.html">Google 網站管理員工具</a>的定義是一樣的,基本上 sitemap 的格式是很簡單的,詳細說明請察看官方文件。<br />
<br />
網路上有很多 sitemap 產生器,但產生出來的結果不如期望,為了做出更好的 sitemap 清單,我就自己作網站的 sitemap 產生器。<br />
<br />
<br />
需要注意的小細節:<br />
<ol><li>sitemap 索引與 sitemap 中 url <span style="color: rgb(255, 0, 0); font-weight: bold;">引入的 xsd 是不一樣的</span>。</li>
<li><span style="color: rgb(255, 0, 0); font-weight: bold;">注意檔案大小</span> 10MB 及筆數的上限 50,000 筆 URL。</li>
<li>檔案如果很大最好<span style="color: rgb(255, 0, 0); font-weight: bold;">用 gzip 壓縮</span>,壓縮率會有 10 倍以上的落差。</li>
<li>一定要用驗證器確認格式是否正確,在壓縮前請先確認格式,<span style="color: rgb(255, 0, 0); font-weight: bold;">驗證器無法解析 gzip</span>。</li>
<li>一份 sitemap 中的 <span style="color: rgb(255, 0, 0); font-weight: bold;">priority 值不能全部一樣</span>,Google 會出現 warning。</li>
<li>如果檔案已經封存不會變動,在 changefreq 的值最好設定為 never ,這樣會得到較好的文件索引。</li>
</ol><br />
<br />
Sitemap:<br />
<pre class="xml" name="code"><?xml version='1.0' encoding='UTF-8'?>
<urlset
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9"
url="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
>
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.example.com/catalog?item=12&desc=v_hawaii</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.example.com/catalog?item=83&desc=v_usa</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
</pre><br />
<br />
Sitemap 索引檔:<br />
<pre class="xml" name="code"><?xml version='1.0' encoding='UTF-8'?>
<sitemapindex
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9"
url="http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
>
<sitemap>
<loc>http://www.example.com/sitemap1.xml.gz</loc>
<lastmod>2004-10-01T18:23:17+00:00</lastmod>
</sitemap>
<sitemap>
<loc>http://www.example.com/sitemap2.xml.gz</loc>
<lastmod>2005-01-01</lastmod>
</sitemap>
</sitemapindex>
</pre><br />
<br />
Sitemap 驗證器:<br />
<a target="_blank" href="http://www.validome.org/google/">Google Sitemap(s) Validator</a><br />
<br />
<br />
參考文章:<br />
<a target="_blank" href="http://www.xe88.com/peter/2006/06/google-sitemaps.html">Peter的部落格: Google Sitemaps 教學</a><br />
<a target="_blank" href="http://jck11.pixnet.net/blog/post/20294775">網站登錄與提交sitemap(Yahoo!) @ 神鵰蝦</a><br />
Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com4tag:blogger.com,1999:blog-5946530704742130970.post-3300382893128648022008-01-27T15:33:00.002+08:002013-06-11T20:54:16.253+08:00架站使用 UTF-8 要檢查的項目一開始最基本的就是環境設定,Server 對於文字的編碼設定,這也是最重要的。<br />
<br />
<span style="color: rgb(0, 0, 153);">關於 Apache Server 的設定:</span><br />
在 /etc/httpd/conf/httpd.conf(Red Hat) 或 /etc/apache2/conf.d/charset(Ubuntu) 中開啟對 UTF-8 編碼的設定:<br />
<span style="color: rgb(255, 0, 0);">AddDefaultCharset utf-8 </span><br />
<br />
<span style="color: rgb(0, 0, 153);">關於 Mysql Server 的設定:</span><br />
在使用 script 進行新增/修改時記得在 script 檔中加入:<br />
<span style="color: rgb(255, 0, 0);">SET NAMES 'utf8';</span><br />
在 PHP 存取前也應該先宣告編碼方式:<br />
<span style="color: rgb(255, 0, 0);">mysql_query("SET NAMES 'UTF8'");</span><br />
<br />
在建立文字欄位(TEXT, VARCHAR, ...)時也必須定義文字的編碼方式:<br />
<span style="color: rgb(255, 0, 0);">CHARACTER SET utf8 COLLATE utf8_unicode_ci</span><br />
<br />
在編寫網頁文件時,除了要注意檔案是否使用 UTF-8 編碼外,還要記得加上編碼宣告,因為解讀器並沒有那麼聰明,沒辦法準確的辨別檔案的編碼方式,所以請一定要加上編碼宣告。<br />
<br />
<span style="color: rgb(0, 0, 153);">關於 HTML 文件的宣告:</span><br />
<span style="color: rgb(255, 0, 0);"><meta equiv="Content-Type" content="text/html; charset=UTF-8"></span><br />
<br />
<span style="color: rgb(0, 0, 153);">關於 XML 文件的宣告:</span><br />
<span style="color: rgb(255, 0, 0);"><?xml version="1.0" encoding="UTF-8"?></span><br />
<br />
<span style="color: rgb(0, 0, 153);">關於 PHP 文件的宣告:</span><br />
<span style="color: rgb(255, 0, 0);">header('Content-type: text/html; charset=utf-8');</span><br />
<br />
參考文章:<a target="_blank" href="http://www.soledadpenades.com/2007/12/11/utf-8-checklist/">UTF-8 checklist - soledad penadés</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0