2

powershell を使用して vcxproj ファイルを解析しようとしています (実際には .NET クラス System.Xml.XmlDocument を使用)。この問題は、ルート要素の xmlns 属性に関係しているようです - 以下の xml ファイルの例を参照してください (元の xml の抜粋)

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
</Project>

powershell を使用して xml ファイルを開き、いくつかのノードを選択したいと考えています。しかし、これは実際にはノードを返しません。

[System.Xml.XmlDocument] $xml = new-object System.Xml.XmlDocument
$xml.Load("/path/to/xml/file")
$nodes = $xml.SelectNodes("//ProjectConfiguration")

すでに名前空間マネージャーを追加しようとしましたが、それは役に立ちませんでした:

[System.Xml.XmlDocument] $xml = new-object System.Xml.XmlDocument
$xml.Load("/path/to/xml/file")
$mgr=new-object System.Xml.XmlNamespaceManager($xml.Psbase.NameTable)
$mgr.AddNamespace("gr",$xml.configuration.psbase.NamespaceURI)
$nodes = $xml.SelectNodes("//ProjectConfiguration")

ルート要素の xmlns 属性を削除すると、すべて正常に動作します。

よろしく、ヨハネス

4

1 に答える 1

3

この PowerShell に適応しC# の例を見つけました。

$inputstring = @'
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
</Project>
'@
$xpath = "/rs:Project/rs:ItemGroup/rs:ProjectConfiguration"
$xmldoc = New-Object System.Xml.XmlDocument
$xmldoc.LoadXml($inputstring)
# !!USE xmldoc.load if you want to load from a file instead

# Create an XmlNamespaceManager for resolving namespaces
$nsmgr = New-Object System.Xml.XmlNamespaceManager($xmldoc.NameTable);
$nsmgr.AddNamespace("rs", "http://schemas.microsoft.com/developer/msbuild/2003");

$root = $xmldoc.DocumentElement
$nodes = $root.SelectNodes($xpath, $nsmgr)

$outputstring = "Found " + $nodes.Count + " item(s)"
write-host $outputstring

私が得る出力は次のとおりです。

Found 2 item(s)
于 2012-07-19T12:30:44.387 に答える