10

私はPHPでいくつかのXMLを読んでいて、現在そのためにDOMDocumentクラスを使用しています。DOMElementタグの(インスタンスの)属性の名前と値を、それらのいずれかが何であるかを事前に知らなくても取得する方法が必要です。ドキュメントはこのようなものを提供していないようです。名前があれば属性の値を取得できることはわかっていますが、どちらもわからないため、両方を見つける必要があります。

のような他のクラスにもこの機能があることも知っていSimpleXMLElementますが、でどのように実行できるかに興味がありますDOMDocument

4

3 に答える 3

27

属性名と属性値(attributeNodesではない)を取得する場合は、DOMNodeオブジェクトの$attrNode->nodeValueプロパティを呼び出す必要があります。

$attributes = array();

foreach($element->attributes as $attribute_name => $attribute_node)
{
  /** @var  DOMNode    $attribute_node */
  $attributes[$attribute_name] = $attribute_node->nodeValue;
}
于 2010-02-08T19:20:52.940 に答える
16

DomNode-> attributesプロパティを使用して、特定のDomNodeのすべての属性を取得できます。これにより、属性名と値を含むDOMNamedNodeMapが返されます。

foreach ($node->attributes as $attrName => $attrNode) {
    // ...
}
于 2009-08-27T03:27:30.547 に答える
0

その配列をデータベースの結果と比較するために、ノード属性を配列に変換する方法を探しているときに、この質問に出くわしました。https://stackoverflow.com/users/264502/jan-molakからの回答でうまくいきますが、私の場合、ノードに一部の属性がないか、空の文字列である可能性があるという事実は考慮されていません。 、NULLDBから返されるがあります。
これをカバーするために、私はそれを以下の関数に拡張しました。これは他の誰かにも役立つかもしれません。

    #Function to convert DOMNode into array with set of attributes, present in the node
    #$null will replace empty strings with NULL, if set to true
    #$extraAttributes will add any missing attributes as NULL or empty strings. Useful for standartization
    public function attributesToArray(\DOMNode $node, bool $null = true, array $extraAttributes = []): array
    {
        $result = [];
        #Iterrate attributes of the node
        foreach ($node->attributes as $attrName => $attrValue) {
            if ($null && $attrValue === '') {
                #Add to resulting array as NULL, if it's empty string
                $result[$attrName] = NULL;
            } else {
                #Add actual value
                $result[$attrName] = $attrValue->textContent;
            }
        }
        #Add any additional attributes, that are expected
        if (!empty($extraAttributes)) {
            foreach ($extraAttributes as $attribute) {
                if (!isset($result[$attribute])) {
                    if ($null) {
                        #Add as NULL
                        $result[$attribute] = NULL;
                    } else {
                        #Or add as empty string
                        $result[$attribute] = '';
                    }
                }
            }
        }
        #Return resulting string
        return $result;
    }
}

属性について話すとき、どういうわけか私にはもう少し「自然」に感じるので、私はに置き換えましnodeValueたが、技術的には、ここでは関係なく同じになります。必要に応じて、この関数は(https://github.com/Simbiat/ArrayHelpers) の一部としてComposerで使用できます。textContent
Simbiat/ArrayHelpers

于 2021-09-08T12:48:32.260 に答える