0

EDITx2:下面的问题似乎是由与我的 XML 模式相关的属性引起的,我主要使用这些属性,因此我可以在 FB 4.7 中验证我的 XML,并且一旦 XML 嵌入到应用程序本身中就不需要了。

创建一个与我的 XML 文档相同但省略 xmlns、xmlns:xsi 和 xsi:schemalocation 属性的 XML 对象会在 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 从中提取元素/节点。这就是我遇到的问题。这里有两个可以按我预期工作的示例,然后是三个不可以的示例:

// #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
  //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 回答
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];

哪个应该返回相同的正确结果。请参阅此处的示例

于 2013-01-04T15:27:35.850 回答
-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 回答