2013-01-03 63 views
0

EDITx2:下面的問題似乎是由於我的XML模式相關的屬性導致的,我主要使用這個屬性,所以我可以在FB 4.7中驗證我的XML,並且不是真的一旦將XML嵌入到應用程序本身中,就需要它。在AS3中嵌入帶有關聯XSD的XML文件的問題

創建一個與我的XML文檔相同但省略xmlns,xmlns:xsi和xsi:schemalocation屬性的XML對象會生成可正確導航的AS中的XML對象。包括它們不僅會導致下面的問題,而且還會導致xmlns和xmlns:xsi屬性被帶到樹中,使得原始XML對象的基於XMLList的子集同樣難以解析。下面的代碼示例已更新以顯示該現象。

現在的問題是:當我以某種方式嵌入XML時,是否可以去除與模式相關的屬性,或者使其更適合於AS?

編輯:我遇到的問題似乎是特別與嵌入式XML文檔有關;直接在AS3中創建的XML變量可以正常運行。

我在AS3有一個看似無意義的問題。讓我們假設一個XML文檔名爲的example.xml,看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<myParent xmlns="http://www.example.com/Schema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.example.com/Schema Schema.xsd"> 
    <myChild id="1"> 
    <myGrandchild cid="1" /> 
    <myGrandchild cid="2" /> 
    </myChild> 
    <myChild id="2"> 
    <myGrandchild cid="3" /> 
    </myChild> 
</myParent> 

然後我試着通過嵌入,這樣將其分配到一個靜態常量(以便其原生類外訪問)在AS3:

[Embed(source="example.xml", mimeType="application/octet-stream")] 
private static const exampleXML:Class; 
public static const myXML:XML = XML(new exampleXML); 

然後我想用XMLList從中提取元素/節點。這是我遇到的問題。這裏有兩個例子是工作,我想指望他們,接着是三個不:

// #1 
var myList:XMLList = myXML.*; 
trace(myList); 
/* 
    <myChild id="1" xmlns="http://www.example.com/Schema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <myGrandchild cid="1" /> 
    <myGrandchild cid="2" /> 
    </myChild> 
    <myChild id="2" xmlns="http://www.example.com/Schema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <myGrandchild cid="3" /> 
    </myChild> 
*/ 

// #2 
var myList:XMLList = myXML.*.(@id==1); 
trace(myList); 
/* 
    <myChild id="1" xmlns="http://www.example.com/Schema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <myGrandchild cid="1" /> 
    <myGrandchild cid="2" /> 
    </myChild> 
*/ 

// #3 
var myList:XMLList = myXML.myChild; 
trace(myList); 
/* 
    (Outputs nothing at all) 
*/ 

// #4 
var myList:XML = myXML.myChild[0]; 
trace(myList); 
/* 
    null 
*/ 

// #5 
var myList:XMLList = myXML.child("myChild"); 
trace(myList); 
/* 
    (Outputs nothing at all) 
*/ 

從理論上講,#3,#5應該給予相同的輸出#1和#4應該給相同的輸出到#2。爲什麼3-5出現空白?將myXML聲明爲靜態或常量有問題嗎?我究竟做錯了什麼?

顯然,我在這裏使用了非常通用的示例。我正在使用的實際XML綁定到XSD模式;如果這可能對我的問題有任何可能的影響,讓我知道,我會發布我的實際代碼。

+0

它[適用於我](http://wonderfl.net/c/apuN).... –

+0

此外,id屬性在文檔中應該是唯一的。見[here](http://www.w3.org/TR/xml-id/) –

+0

已編輯;看起來像是特定於嵌入式文檔。我正在使用一個非常通用的示例;如果需要,我將發佈的原始文檔沒有任何重複的屬性。 – eclecto

回答

-1

好吧,終於想出了這一個。我已經成功地使用正則表達式來淨化所有XMLNS和XSI聲明的XML:

[Embed(source="example.xml", mimeType="application/octet-stream")] 
private static const exampleXML:Class; 
public static const myXML:XML = clean(new XML(new exampleXML)); 

private static function clean(xml:XML):XML { 
    var myXmlStr:String = xml.toString(); 
    var xmlPattern:RegExp = new RegExp("(xmlns|xsi)[^\"]*\"[^\"]*\"", "gi"); 
    myXmlStr = myXmlStr.replace(xmlPattern, ""); 
    xml = new XML(myXmlStr); 
    return xml; 
} 

生成的XML對象,現在可以正常地走過,它仍然是一個靜態常量,所以我可以訪問它,而無需創建一個實例在我編輯XML文檔本身時,我可以保持模式不變。

0
//Since a namespace was defined in The xml you need access it via the namespace Object 
    var myXML:XML = 
    <myParent xmlns="http://www.w3.org/2000/Schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/Schema Schema.xsd"> 
    <myChild id="1"> 
     <myGrandchild cid="1" >fus</myGrandchild> 
     <myGrandchild cid="2" >ro</myGrandchild> 
    </myChild> 
    <myChild id="2"> 
     <myGrandchild cid="3" >do</myGrandchild> 
    </myChild> 
    </myParent> 

    // to access nodes that are in a non-default namespace you must first create a namespace object 
    var myChildns:Namespace = new Namespace('http://www.w3.org/2000/Schema'); 
    trace(myXML..myChildns::myChild.(@id == '1').myChildns::myGrandchild.(@cid == '1').toString())// traces out fus 
0

每個XML文檔都屬於某個隱式名稱空間,該名稱空間通常是「」或空字符串。通過使用xmlns屬性,您將更改文檔中無前綴節點所使用的隱式名稱空間 - 這就是爲什麼當您在文檔內部選擇節點或節點組時,您會看到名稱空間屬性「移動」。

xmlns屬性存在時,那麼當使用e4x查詢它們時,您必須限定您的選擇,否則它們不會匹配。例如:

<paystub:section></paystub:section> 

是不一樣的事情:

<article:section></article:section> 

你可以在一個命名空間中,通過使用專門查詢節點(如The_asMan建議,我打字這一段時間):

namespace schema = 'http://www.w3.org/2000/Schema' 
var list:XMLList = myXml.schema::myChild; 
var node:XML = myXml.schema::myChild[0]; 

或者您可以爲以下示波器設置「使用」模式,然後查詢不合格:

namespace schema = 'http://www.w3.org/2000/Schema' 

use namespace schema; 

var list:XMLList = myXml.myChild; 
var node:XML = myXml.myChild[0]; 

哪個應該返回相同的正確結果。請參閱example here