我正在创建一个网页来更新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>";
感谢您的帮助,
斯科特。
答案 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”。这个词可以是任何东西,不一定是“默认”。