16

Visual Studio プロジェクト ファイルを更新する Python スクリプトを作成しています。それらは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" 
      xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
      ...

次のコードは、ファイルを読み取ってから書き込みます。

import xml.etree.ElementTree as ET

tree = ET.parse(projectFile)
root = tree.getroot()
tree.write(projectFile,
           xml_declaration = True,
           encoding = 'utf-8',
           method = 'xml',
           default_namespace = "http://schemas.microsoft.com/developer/msbuild/2003")

Python は最後の行で次のようにエラーをスローします。

ValueError: cannot use non-qualified names with default_namespace option

私はただ読み書きしているだけで、その間に編集はしていないので、これは驚くべきことです。Visual Studio は、既定の名前空間のない XML ファイルの読み込みを拒否するため、省略は任意ではありません。

なぜこのエラーが発生するのですか? 提案または代替案を歓迎します。

4

3 に答える 3

38

This is a duplicate to Saving XML files using ElementTree

The solution is to define your default namespace BEFORE parsing the project file.

ET.register_namespace('',"http://schemas.microsoft.com/developer/msbuild/2003")

Then write out your file as

tree.write(projectFile,
           xml_declaration = True,
           encoding = 'utf-8',
           method = 'xml')

You have successfully round-tripped your file. And avoided the creation of ns0 tags everywhere.

于 2013-08-20T17:05:46.587 に答える
0

これは、私の問題に最も近い答えでした。置く:

ET.register_namespace('',"http://schemas.microsoft.com/developer/msbuild/2003")

ファイルの解析が機能しない直前。

読み込んでいる xml ファイルが使用している特定の名前空間を見つける必要があります。そのために、使用する名前空間とタグ名を提供する ET ツリー ノードのタグの要素を出力し、その名前空間を次の場所にコピーします。

ET.register_namespace('',"XXXXX YOUR NAMESPACEXXXXXX")

ファイルの解析を開始する前に、書き込み時にすべての名前空間を削除する必要があります。

于 2015-06-15T18:11:50.723 に答える