MSXML

2013-05-10 9 views
11

で、デフォルトの名前空間を照会するにはどうすればいくつかのXMLを持っているこれはそれだけできれいと短いですが、私が使用している実際のXMLではなく、問題を示します。MSXML

IXMLDOMNode node = doc.selectSingleNode("//PropertyGroup/@Condition"); 

、それが正常に動作します::

条件= " '$(キー)' == '1111'"

私は、ノードを照会することができますMSXMLを使用して

しかし、それは実際に私が持っているXMLではありません

実際にはXMLには名前空間宣言が含まれています:

のxmlns = "http://schemas.microsoft.com/developer/msbuild/2003" 実際 XMLドキュメントを作成する

<?xml version="1.0" ?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Condition="'$(key)'=='1111'"> 
      <Key>Value</Key> 
    </PropertyGroup> 
</Project> 

今私のクエリ:

IDOMNode node = doc.selectSingleNode("//PropertyGroup/@Condition"); 

は一致するノードを返しません。

MSXMLを使用して既定の名前空間をクエリするにはどうすればよいですか?

:私はすでに知っているhow to query the non-default namespace in xml

  • 。あなたが使用します。

    doc.setProperty("SelectionNamespaces", 
         "xmlns="http://schemas.microsoft.com/developer/msbuild/2003"); 
    
  • 私はすでにhow to query the default namespace in .NETを知っています。あなたは、名前空間マネージャを使用して、クエリそれはもはやデフォルトんだから、あなたは、デフォルト以外の名前空間を照会することができ、その名前を使用して、デフォルトの名前空間に名前を付け

  • だけから攻勢xmlnsテキストを削除することができますXML文字列は、私が受け取る、私はむしろ私は「デフォルト」、またはMSXMLを使用して「無名の」名前空間を照会するにはどうすればよい

「それを正しい方法を行う」だろうか?


<?xml version="1.0" encoding="UTF-16" standalone="yes"?> 
    <ShowPlanXML Version="1.1" Build="10.50.1600.1" 
        xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
     <BatchSequence> 
      <Batch> 
      ... 
      </Batch> 
     </BatchSequence> 
    </ShowPlanXML> 

は再びあなたが問題の名前空間宣言を見ることができます:実際にはXML、私はSQL ServerのXML 実行プラン出力を使用しています。削除は機能しますが、それは面倒です。

他に何を試しましたか? Microsoft hints at in a KB articleとして

doc.setProperty('SelectionNamespaces', 
     'xmlns="http://schemas.microsoft.com/developer/msbuild/2003"'); 

は、私はまた、SelectionNamespaceを設定してみました。

どうすればをデフォルトのネームスペースにするのですか?

実際には私はケア名前空間についてはありません。私の質問は理にかなっており、私はそれを働かせたい。だから、質問への別のアプローチは、次のようになります。

にはどうすればいいか、か、デフォルトの名前空間を照会することができ、そして、どんなその名前空間名ではありません(きませんか)?

:MSXMLがネイティブコードであり、そしてあなたはそれを追加するときにネイティブのWin32コンパイラ(すなわち無.NETフレームワークやCLR)から

+0

もう1つ更新しました。私は映画館から家に帰ってきたときに私を襲った。 – granadaCoder

+0

@granadaCoder映画を見ながらStackOverflowに応答していました! –

+0

ドライブの家で、私はこの事にCPUの「サイクル」をいくつか与えました。私のラジオはちょうど私の上で死んだ。 – granadaCoder

答えて

14

を、それを使用して明示的に名前空間に名前を付け​​:その後、

doc.setProperty("SelectionNamespaces", 
     "xmlns:peanut='http://schemas.microsoft.com/developer/msbuild/2003'"); 

と、その名前空間使用を照会:

IDOMNode node = doc.selectSingleNode("//peanut:PropertyGroup/@Condition"); 

名前空間に任意の省略名(この場合はpeanut)を指定できます。そして接頭辞として省略形を使用してください(この場合はpeanut:PropertyGroup)。

以前提案

私はXml.Linqに移動しようとするだろう。

ここに(名前空間を持つ)サンプルがあります。

 try 
    { 

     XDocument xDoc1 = XDocument.Parse("<?xml version=\"1.0\" ?><Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"><PropertyGroup Condition=\"'$(key)'=='1111'\"><Key>Value</Key></PropertyGroup></Project>"); 
     XNamespace ns1 = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003"); 

     var list1 = from list in xDoc1.Descendants(ns1 + "Project") 
        from item in list.Elements(ns1 + "PropertyGroup") 
        /* where item.Element(ns + "HintPath") != null */ 
        where item.Attribute("Condition") != null 
        select new 
        { 
         MyCondition = item.Attribute("Condition") == null ? "Not Here!" : item.Attribute("Condition").Value, 
         MyFake = item.Attribute("DoesNotExistTest") == null ? "Not Here Sucker!" : item.Attribute("DoesNotExistTest").Value 
        }; 


     foreach (var v in list1) 
     { 
      Console.WriteLine(v.ToString()); 
     } 


     XDocument xDoc2 = XDocument.Parse("<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"yes\"?> <ShowPlanXML Version=\"1.1\" Build=\"10.50.1600.1\"     xmlns=\"http://schemas.microsoft.com/sqlserver/2004/07/showplan\">  <BatchSequence>   <Batch>Something I Threw In Here</Batch>  </BatchSequence> </ShowPlanXML> "); 
     XNamespace ns2 = XNamespace.Get("http://schemas.microsoft.com/sqlserver/2004/07/showplan"); 

     var list2 = from list in xDoc2.Descendants(ns2 + "ShowPlanXML") 
        from item in list.Elements(ns2 + "BatchSequence") 
        /*        where item.Attribute("Condition") != null */ 
        where item.Element(ns2 + "Batch") != null 
        select new 
        { 
         BatchValue = (item.Element(ns2 + "Batch") == null) ? string.Empty : item.Element(ns2 + "Batch").Value 
        }; 


     foreach (var v in list2) 
     { 
      Console.WriteLine(v.ToString()); 
     } 



    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
+0

申し訳ありませんが、 'IDOMNode'ではなく' IXMLDOMNode'です。これは、***ネイティブ*** msxml COMオブジェクトライブラリからです。これはネイティブからのものではなく(つまり、.NETではない) –

+0

私のアップデートでヒントを確認してください。私は推測していますが、ちょうど.Netの応答を残すよりも優れていると思います。 – granadaCoder

+0

私はあなたに答えを忘れてしまった。それはうまくいった。あなたがデフォルトの名前空間に名前をつけてから使用するのは恐ろしいことです。しかし、少なくともそれは実行可能な解決策です! –

関連する問題