php - 使用 PHP 查找所有 XML 命名空间 URI

标签 php xml xpath

假设我在 XML 文档中有以下命名空间:

xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"
xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"

这是 XML 文档:
<?xml version="1.0"?>
<GetMatchingProductForIdResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetMatchingProductForIdResult Id="B0009VCOU4" IdType="ASIN" status="Success">
    <Products xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
    <Product>
        <Identifiers>
            <MarketplaceASIN>
                <MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
                <ASIN>B0009VCOU4</ASIN>
            </MarketplaceASIN>
        </Identifiers>
        <AttributeSets>
            <ns2:ItemAttributes xml:lang="en-US">
                <ns2:Binding>Electronics</ns2:Binding>
                <ns2:Brand>DOBANI</ns2:Brand>
                <ns2:Feature>Handcrafted Quality, Value Priced</ns2:Feature>
                <ns2:Feature>Satisfaction Guaranteed! 30-Day Return Policy!</ns2:Feature>
                <ns2:ItemDimensions>
                    <ns2:Height Units="inches">7.00</ns2:Height>
                    <ns2:Length Units="inches">6.00</ns2:Length>
                    <ns2:Width Units="inches">6.00</ns2:Width>
                </ns2:ItemDimensions>
                <ns2:Label>Mid-East</ns2:Label>
                <ns2:ListPrice>
                    <ns2:Amount>9.90</ns2:Amount>
                    <ns2:CurrencyCode>USD</ns2:CurrencyCode>
                </ns2:ListPrice>
                <ns2:Manufacturer>Mid-East</ns2:Manufacturer>
                <ns2:Model>BULB</ns2:Model>
                <ns2:PackageDimensions>
                    <ns2:Height Units="inches">3.70</ns2:Height>
                    <ns2:Length Units="inches">8.10</ns2:Length>
                    <ns2:Width Units="inches">4.00</ns2:Width>
                    <ns2:Weight Units="pounds">0.35</ns2:Weight>
                </ns2:PackageDimensions>
                <ns2:PackageQuantity>1</ns2:PackageQuantity>
                <ns2:PartNumber>BULB</ns2:PartNumber>
                <ns2:ProductGroup>Single Detail Page Misc</ns2:ProductGroup>
                <ns2:ProductTypeName>MUSICAL_INSTRUMENTS</ns2:ProductTypeName>
                <ns2:Publisher>Mid-East</ns2:Publisher>
                <ns2:SmallImage>
                    <ns2:URL>http://ecx.images-amazon.com/images/I/31Fsu5jKWsL._SL75_.jpg</ns2:URL>
                    <ns2:Height Units="pixels">75</ns2:Height>
                    <ns2:Width Units="pixels">50</ns2:Width>
                </ns2:SmallImage>
                <ns2:Studio>Mid-East</ns2:Studio>
                <ns2:Title>Spare Rubber Bulb</ns2:Title>
            </ns2:ItemAttributes>
        </AttributeSets>
        <Relationships/>
        <SalesRankings>
            <SalesRank>
                <ProductCategoryId>sdp_misc_display_on_website</ProductCategoryId>
                <Rank>36468</Rank>
            </SalesRank>
        </SalesRankings>
    </Product>
</Products>
</GetMatchingProductForIdResult>
<ResponseMetadata>
    <RequestId>afnapq823haeufabq2rhalhtz</RequestId>
</ResponseMetadata>
</GetMatchingProductForIdResponse>

我将如何查找这两者以便可以注册它们以供 Xpath 使用?

最初,我认为以下方法会起作用,但事实并非如此:
$domDoc =  new DOMDocument();

$domDoc->loadXML($xml);

$xpath = new DOMXPath($domDoc);

$xpath->registerNamespace('ns', $domDoc->documentElement->lookupNamespaceURI(NULL));
$xpath->registerNamespace('n2', $domDoc->documentElement->lookupNamespaceURI('ns2'));

寻找一种更简洁的方法来解决将路径的每一部分都包含在 local-name 中的需要。功能。

最佳答案

ns2 命名空间注册到 products 节点,因此您需要调用 products 节点的 lookupNamespaceURI 方法。这很丑陋,但可以解决问题:

$xpath->registerNamespace('ns', $domDoc->documentElement->lookupNamespaceURI(NULL));
$productNode = $xpath->query("/ns:GetMatchingProductForIdResponse/ns:GetMatchingProductForIdResult/ns:Products")->item(0);
$xpath->registerNamespace('n2', $productNode->lookupNamespaceURI('ns2'));

关于php - 使用 PHP 查找所有 XML 命名空间 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620308/

相关文章:

Android Studio - 这个资源文件结构技巧是如何实现的?

xml - 如何从 XML 中提取子节点值作为字符串

php - 如何在 Magento 上处理多币种和自定义报价项目价格?

javascript - 我想查看有多少人选择了

用户界面上的 phpmyadmin 图形不起作用

php - 什么是 & in return($var & 1) 在 PHP 中

xml - 合并具有相同属性的元素

objective-c - 使用 NSXMLParser 解析 XML 文件

python - Scrapy 调试 : Crawled (200)

xml - 用于将属性值与集合进行匹配的 XPath 查询