重複するXML名前空間定義を排除する方法は? -- xml フィールド と namespaces フィールド と xml-namespaces フィールド 関連 問題

How to eliminate duplicate XML namespace definitions?












1
vote

問題

日本語

私はしばしば同じ名前空間が必要な要素の親要素でのみ、同じ名前空間が複数回定義されていることがよくあります。

XML内のすべてのネームスペース定義を抽出し、各ネームスペースが一度だけ定義されるように、これらの定義のそれぞれをノードに再配置するための簡単なメソッド/ツールがありますか?好ましくは、(いくつかの親からデフォルトのネームスペースを使用するのではなく)それらの名前空間との接頭辞を付けるためのオプションを使用することができます。私はこれがより多くの人間が読めるXMLを生み出すと思います。

例として、どのように自動的にこの

を翻訳することができますか <事前> <コード> <m:Albums xmlns:m="http://www.example.com/music"> <m:Album xmlns:m="http://www.example.com/music"> <m:Artist xmlns:m="http://www.example.com/music"> <c:Name xmlns:c="http://www.example.com/common"> Sting </c:Name> </m:Artist> <m:Title> Mercury Falling </m:Title> </m:Album> <Album xmlns="http://www.example.com/music"> <Artist> <c:Name xmlns:c="http://www.example.com/common"> Maria Mena </c:Name> </Artist> <Title xmlns="http://www.example.com/music"> Weapon in Mind </Title> </Album> </m:Albums>

これに?

<事前> <コード> <m:Albums xmlns:m="http://www.example.com/music" xmlns:c="http://www.example.com/common"> <m:Album> <m:Artist> <c:Name> Sting </c:Name> </m:Artist> <m:Title> Mercury Falling </m:Title> </m:Album> <m:Album> <m:Artist> <c:Name> Maria Mena </c:Name> </m:Artist> <m:Title> Weapon in Mind </m:Title> </m:Album> </m:Albums>
英語

I often come across XML where the same namespace is defined multiple times, instead of only at a parent element of the elements where it is needed.

Is there a simple method/tool for extracting all namespace definitions in an XML and relocating each of these definitions to a node such that each namespace is defined only once? Preferably also with an option for all nodes to be prefixed with their namespace (rather than using a default namespace from some parent). I find this would yield more human readable XML.

As an example, how could one automatically translate this

<m:Albums xmlns:m="http://www.example.com/music">   <m:Album xmlns:m="http://www.example.com/music">     <m:Artist xmlns:m="http://www.example.com/music">       <c:Name xmlns:c="http://www.example.com/common">         Sting       </c:Name>     </m:Artist>     <m:Title>       Mercury Falling     </m:Title>   </m:Album>   <Album xmlns="http://www.example.com/music">     <Artist>       <c:Name xmlns:c="http://www.example.com/common">         Maria Mena       </c:Name>     </Artist>     <Title xmlns="http://www.example.com/music">       Weapon in Mind     </Title>   </Album> </m:Albums> 

into this?

<m:Albums xmlns:m="http://www.example.com/music" xmlns:c="http://www.example.com/common">   <m:Album>     <m:Artist>       <c:Name>         Sting       </c:Name>     </m:Artist>     <m:Title>       Mercury Falling     </m:Title>   </m:Album>   <m:Album>     <m:Artist>       <c:Name>         Maria Mena       </c:Name>     </m:Artist>     <m:Title>       Weapon in Mind     </m:Title>   </m:Album> </m:Albums> 
</div
        

回答リスト

0
 
vote

私自身の質問に対する部分的な答えとして、UNIXコマンド

が見つかりました <事前> <コード> xmllint --nsclean

は問題を部分的に解決しますが、重複したすべての名前空間を排除しません。質問からマイ例XMLに適用すると、次のことが得られます。

<事前> <コード> <m:Albums xmlns:m="http://www.example.com/music"> <m:Album> <m:Artist> <c:Name xmlns:c="http://www.example.com/common"> Sting </c:Name> </m:Artist> <m:Title> Mercury Falling </m:Title> </m:Album> <Album xmlns="http://www.example.com/music"> <Artist> <c:Name xmlns:c="http://www.example.com/common"> Maria Mena </c:Name> </Artist> <Title> Weapon in Mind </Title> </Album> </m:Albums>

これは、親ノードですでに宣言されている名前空間を排除します。ただし、共通の親( c:Name ノード)までの重複ネームスペース宣言を引いていません(例:<コード> c:Name ノード)、影響を受けるノードを変換して、同等のデフォルト以外の名前空間を使用することによってデフォルトの名前空間を削除することもできません(例えば、デフォルトの名前空間の Album ノードとその子)。

xmllint が失敗した場合も、重複ネームスペースを削除できるソリューションを依然として望んでいます。
 

As a partial answer to my own question I found that the unix command

xmllint --nsclean 

partially solves the problem, but it does not eliminate all duplicate namespaces. When applied to my example XML from the question, it yields the following.

<m:Albums xmlns:m="http://www.example.com/music">   <m:Album>     <m:Artist>       <c:Name xmlns:c="http://www.example.com/common">         Sting       </c:Name>     </m:Artist>     <m:Title>       Mercury Falling     </m:Title>   </m:Album>   <Album xmlns="http://www.example.com/music">     <Artist>       <c:Name xmlns:c="http://www.example.com/common">         Maria Mena       </c:Name>     </Artist>     <Title>       Weapon in Mind     </Title>   </Album> </m:Albums> 

This eliminates namespaces already declared in a parent node. However, it does not pull duplicate namespace declarations up to a common parent (e.g. the c:Name nodes), nor does it remove a duplicate default namespace by converting the affected nodes to use an equivalent non-default namespace (e.g. the Album node in the default namespace, and its children).

Still hoping for a solution which can remove duplicate namespaces also in the cases where xmllint fails.

</div
 
 
   
   
0
 
vote
vote
ベストアンサー
 

私自身の質問に対するより良い答えとして、私はこの外部XSLT変換これは私が欲しかったものです。

このXSLTをSAXON:

で使用して質問の入力XMLを変換した結果 <事前> <コード> <m:Albums xmlns:m="http://www.example.com/music" xmlns:c="http://www.example.com/common"> <m:Album> <m:Artist> <c:Name> Sting </c:Name> </m:Artist> <m:Title> Mercury Falling </m:Title> </m:Album> <m:Album> <m:Artist> <c:Name> Maria Mena </c:Name> </m:Artist> <m:Title> Weapon in Mind </m:Title> </m:Album> </m:Albums>
 

As yet a better answer to my own question, I stumbled across this external XSLT transformation, which does exactly what I wanted.

The result from transforming the question's input XML using this XSLT with Saxon:

<m:Albums xmlns:m="http://www.example.com/music" xmlns:c="http://www.example.com/common">   <m:Album>     <m:Artist>       <c:Name>         Sting       </c:Name>     </m:Artist>     <m:Title>       Mercury Falling     </m:Title>   </m:Album>   <m:Album>     <m:Artist>       <c:Name>         Maria Mena       </c:Name>     </m:Artist>     <m:Title>       Weapon in Mind     </m:Title>   </m:Album> </m:Albums> 
</div
 
 

関連する質問

6  XMLスキーマと組み合わせて使用​​される表記の名前  ( Name of notation used in conjunction with xml schema ) 
このスタイルのこのスタイルの名は、文字括弧内の完全な名前空間URIとそれに続く識別子名を含むを探しています。 <事前> <コード> {http://www.w3.org/2001/XMLSchema}dateTime ...

1  R.の未定義のネームスペースXML2  ( Undefined namespace xml2 in r ) 
XMLを解析するためにRを使う方法を学んで、Hadley's Wickham's xml2 パッケージを使用してTEI XMLテキスト文書を解析しようとしています。ここ(警告:これzipファイルである、私が解析しようとしている特定のものは以下のコードにあり...

0  XElement.Load()および「宣言されていないプレフィックス」例外  ( Xelement load and undeclared prefix exception ) 
XElement.Load()メソッドを使用してXMLファイルをロードしようとしています。ファイルがいくつか取得されます。そのような厄介なXMLの内容は、この単純化されたバージョンと似ています: <事前> <コード> <?xml version="1.0" ...

-1  XML内のすべてのネームスペースを削除し、WSDLごとに有効  ( Removing all namespaces in the xml and valid per wsdl ) 
再び私は同じWSDLに関連する質問で戻ってきて、今回は要求内のすべてのネームスペースを削除し、WSDLに準拠していました。 同じWSDL TripService WSDLからリンクの「From」要素を以下のものに置き換えます。 <事前> <コード> <xs:e...

92  ElementFormDefaultはXSDで何をしますか?  ( What does elementformdefault do in xsd ) 
elementFormDefault は何をしていますか、いつ使用されるべきですか? だから私は elementFormDefault 値の定義を見つけました: 認定 - 要素と属性 のTargetNamespaceにあります スキーマ 未...

2  W3C正規化は文書サブセットのためにどのように機能しますか?  ( How does w3c canonicalization work for document subsets ) 
"xmllint - c14n"が正しく機能しているのであれば私はわかりません ネームスペース。次の入力のために、私の手作りの遺産 W3C正準化の実装は下に引き下げます Namespace DECL XMLNS:XSIからDCOUMENT-TAG。 <事...

0  ローカルXMLネームスペース定義が予想されていないように機能しない  ( Local xml namespace definition not working as i expected ) 
ArgouMLからエクスポートされたXMI文書を処理しています。 の要素があります <コード> <UML:DataType href='http://argouml.org/profiles/uml14/default-uml14.xmi#-84-17...

65  RDFトリプルは何ですか?  ( Whats a rdf triple ) 
Laymanの用語では、RDFトリプルは何ですか? ...

6  XSLT出力ルートからXMLネームスペース宣言を削除しますか?  ( Remove xml namespace declaration from xslt output root ) 
次の入力XMLを持つ: <事前> <コード> <?xml version="1.0" encoding="utf-8" ?> <customSettings xmlns:env="urn:schemas-test-env"> <connectionSt...

2  XAML:ネームスペース奇妙な行動Visual Studio  ( Xaml namespace strange behaviour visual studio ) 
私の現在のWPFプロジェクトの1つに問題があります。プロジェクトは、まったく罰金(そして実行)するために使用される。その後、ライセンスの懸念のため、ライブラリーから拡張WPFツールキットを削除することにしました。 NumericUpDown S(<コード>...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有