3

私は次のような出力を追加しようとしています:

<mets ....
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/METS/       
http://www.loc.gov/standards/mets/mets.xsd">

xmlns:xlinkすべて正常に生成できますが、属性を追加できません。私が得る最も近いものは次のとおりです。

$this->xml = new SimpleXMLElement('<mets></mets>');
$mets->addAttribute("xlink:someName", "blabla", "http://www.w3.org/1999/xlink");    
$mets->addAttribute("xsi:schemaLocation", "http://www.loc.gov/METS/  
http://www.loc.gov/standards/mets/mets.xsd",
"http://www.w3.org/2001/XMLSchema-instance");

生成:

<mets ....
xmlns:xlink="http://www.w3.org/1999/xlink"
----begin of part I don't desire-----
xlink:someName="blablabla"
----end of  part I don't desire-----
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/METS/       
http://www.loc.gov/standards/mets/mets.xsd">

xmlns:xlinkを追加せず に追加するにはどうすればよいxlink:somethingElseですか?

4

1 に答える 1

4

私が思いついた解決策はかなり簡単です:

なぜなら

$mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink");

は常に 2 つの属性を追加します。1 つは名前空間宣言用 ( xmlns:xlink) で、次に実際に追加する属性 ( xlink:someName) です。不要な追加属性を削除するだけで、プレフィックスの名前空間属性は残ります。

unset($mets->attributes('xlink', true)['someName']);

完全な例:

$mets = new SimpleXMLElement('<mets></mets>');
$mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink");
unset($mets->attributes('xlink', true)['someName']);
echo $mets->asXML();

出力:

<?xml version="1.0"?>
<mets xmlns:xlink="http://www.w3.org/1999/xlink"/>

ただし、これは通常は必要ありません。何かのために名前空間を使用する必要があります-その後、必要に応じて simplexml が追加します-または、必要ない場合は追加する必要はありません。

XML 自体には、使用されていない名前空間を宣言する必要はまったくありません。したがって、おそらくそれを省略するか、後で特定の xlink 要素/属性など、追加する必要がある場所にのみ追加する必要があります。

名前空間をサポートする XML パーサーはすべて、整形式の XML+Namspaces ドキュメントをサポートするため、ルート要素にその宣言が含まれているかどうか、およびどの接頭辞が付いているかを心配する必要はありません。Simplexml はそれを処理するだけで、必要な場所に xlink 属性を追加するだけです。例:

$mets = new SimpleXMLElement('<mets></mets>');
$child = $mets->addChild('child');
$child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink');
$child = $child->addChild('child');
$child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink');
echo $mets->asXML();

出力:

<?xml version="1.0"?>
<mets>
  <child xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="child.xml">
    <child xlink:href="child.xml"/>
  </child>
</mets>
于 2013-03-05T13:54:21.447 に答える