尝试使用xpath搜索adobe flash xml文件

时间:2014-03-17 16:53:15

标签: php xml xpath

我正在创建一个网页来更新Adobe Flash项目XML文件。它是使用Simple XML和XPath在php中编写的。唯一的问题是xPath不会搜索和文件。我尝试使用基本的XML文件,xPath可以工作。

我正在尝试找到一个特定的节点"<characters>"并替换它的集中。

以下是XML文件示例:

<DOMSymbolItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ns.adobe.com/xfl/2008/" name="Bt_Section manager" itemID="4725e7f8-000000db" symbolType="button" lastModified="1193667148">
  <timeline>
    <DOMTimeline name="Bt_Section manager">
      <layers>
        <DOMLayer name="Layer 1" color="#4F80FF" current="true" isSelected="true">
          <frames>
            <DOMFrame index="0" keyMode="9728">
              <elements>
                <DOMShape>
                  <fills>
                    <FillStyle index="1">
                      <SolidColor color="#FFDB62"/>
                    </FillStyle>
                  </fills>
                  <strokes>
                    <StrokeStyle index="1">
                      <SolidStroke scaleMode="normal" weight="2">
                        <fill>
                          <SolidColor/>
                        </fill>
                      </SolidStroke>
                    </StrokeStyle>
                  </strokes>
                  <edges>
                    <Edge fillStyle1="1" strokeStyle="1" edges="!809.5 0|5854 1.5!5854 1.5|6702 1188!6702 1188|0 1188!0 1188|809.5 0"/>
                  </edges>
                </DOMShape>
                <DOMStaticText selected="true" fontRenderingMode="standard" left="-112.25" width="141.55" height="46.7" isSelectable="false">
                  <matrix>
                    <Matrix a="0.754364013671875" d="0.746505737304688" tx="193.75" ty="14.1"/>
                  </matrix>
                  <textRuns>
                    <DOMTextRun>
                      <characters>Section manager</characters>
                      <textAttrs>
                        <DOMTextAttrs alignment="center" aliasText="false" autoKern="false" useScreenSpacing="true" size="20" face="Arial-BoldMT"/>
                      </textAttrs>
                    </DOMTextRun>
                  </textRuns>
                </DOMStaticText>
              </elements>
            </DOMFrame>
            <DOMFrame index="1" keyMode="9728">
              <elements>
                <DOMShape>
                  <fills>
                    <FillStyle index="1">
                      <SolidColor color="#FFDB62"/>
                    </FillStyle>
                  </fills>
                  <strokes>
                    <StrokeStyle index="1">
                      <SolidStroke scaleMode="normal" weight="2">
                        <fill>
                          <SolidColor/>
                        </fill>
                      </SolidStroke>
                    </StrokeStyle>
                  </strokes>
                  <edges>
                    <Edge fillStyle1="1" strokeStyle="1" edges="!809.5 0|5854 1.5!5854 1.5|6702 1188!6702 1188|0 1188!0 1188|809.5 0"/>
                  </edges>
                </DOMShape>
                <DOMStaticText selected="true" fontRenderingMode="standard" left="-112.25" width="141.55" height="46.7" isSelectable="false">
                  <matrix>
                    <Matrix a="0.754364013671875" d="0.746505737304688" tx="193.75" ty="14.1"/>
                  </matrix>
                  <textRuns>
                    <DOMTextRun>
                      <characters>Section manager</characters>
                      <textAttrs>
                        <DOMTextAttrs alignment="center" aliasText="false" autoKern="false" useScreenSpacing="true" size="20" face="Arial-BoldMT" fillColor="#FF6600"/>
                      </textAttrs>
                    </DOMTextRun>
                  </textRuns>
                </DOMStaticText>
             </elements>
            </DOMFrame>
          </frames>
        </DOMLayer>
      </layers>
    </DOMTimeline>
  </timeline>
</DOMSymbolItem>

我尝试使用和不使用DOM。

这是我尝试过没有结果的。

$xmlDoc=simplexml_load_file($XMLFile); 
$dom = new DOMDOcument();
$dom->loadXML($xmlDoc);
$xpath = new DOMXpath($dom);

echo "<pre>";

$result =   $xpath->query("//characters");              
      print_r($result);

echo "</pre>";

感谢您的帮助,

斯科特。

1 个答案:

答案 0 :(得分:0)

正如您在XML文档中看到的那样,characters节点没有名称空间前缀。这意味着它们使用默认命名空间,该命名空间由xmlns属性在根元素中定义。在给定的XML文档中,此默认命名空间为“http://ns.adobe.com/xfl/2008/”。

您只需要在使用XPath查询其中的任何元素之前注册此默认命名空间,如下所示:

$xmlDoc=simplexml_load_file($XMLFile);

$xmlDoc->registerXPathNamespace("default", "http://ns.adobe.com/xfl/2008/");
$charactersNodes = $xmlDoc->xpath("//default:characters");

请注意,我在注册此默认命名空间时使用了上面的“default”一词,稍后在使用XPath查询时再次使用了“default”。这个词可以是任何东西,不一定是“默认”。