0

EDITx2:以下の問題は、XMLスキーマに関連する属性が原因であると思われます。これは、主にFB 4.7でXMLを検証できるようにするために使用しており、XMLがアプリ自体に埋め込まれると実際には必要ありません。

私のXMLドキュメントと同じXMLオブジェクトを作成しますが、xmlns、xmlns:xsi、およびxsi:schemalocation属性を省略すると、AS内のXMLオブジェクトを適切にナビゲートできます。それらを含めると、以下の問題が発生するだけでなく、xmlns属性とxmlns:xsi属性がツリーに引き継がれ、元のXMLオブジェクトのXMLListベースのサブセットを同様に分析することが困難になります。以下のコード例は、現象を示すために更新されています。

問題は次のようになります。XMLを何らかの方法で埋め込んだときにスキーマ関連の属性を削除することはできますか、それともASに適したものにすることができますか?

編集:私が経験している問題は、埋め込まれたXMLドキュメントに特に関連しているようです。AS3で直接作成されたXML変数は、通常どおりトラバースできます。

AS3で一見無意味な問題が発生しています。次のようなexample.xmlという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を使用してこれから要素/ノードを抽出します。これが私が遭遇しているものです。これが私が期待するように機能する2つの例であり、その後に機能しない3つの例が続きます。

// #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スキーマに関連付けられています。それが私の問題に影響を与える可能性がある場合は、私に知らせてください。実際のコードを投稿します。

4

3 に答える 3

0

すべての XML ドキュメントは、何らかの暗黙の名前空間に属しています。その名前空間は通常、"" または空の文字列です。xmlns 属性を使用すると、ドキュメント内の接頭辞のないノードで使用される暗黙の名前空間が変更されます。ドキュメント内のノードまたはノードのグループをサブ選択すると、名前空間属性が「移動」するのはそのためです。

属性が存在する場合、xmlnse4x を使用してクエリを実行するときは、選択を修飾する必要があります。そうしないと、一致しません。例えば:

<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];

同じ正しい結果が返されるはずです。こちらの例をご覧ください

于 2013-01-04T15:27:35.850 に答える
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
于 2013-01-04T15:17:43.777 に答える
-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 ドキュメント自体を編集するときにスキーマをそのまま維持できます。

于 2013-01-04T14:52:50.603 に答える