2011-01-11 7 views
4

私はinfopathドキュメントのxmlをチェックしてドキュメントをチェックするか、ドキュメントを破棄するかどうかを確認するために私が使用するsharepoint上でいくつかのC#コードを実行しています。私はxmlファイルからXmlNamespaceManagerオブジェクトを作成できますか?

コードは、私が作成したいくつかの異なるフォームテンプレートで正常に動作していますが、最新のものでは失敗しています。 私が作成しているXmlNamespaceManagerに、 "MY"ネームスペースの間違った違いが含まれていることを発見しました。

私は私が私のてXmlNamespaceManager私はその後、

XPathNavigator nav = xml.CreateNavigator().SelectSingleNode("//my:HasSaved", NamespaceManager); 
後に私は、XMLを検索するために、次のコード行を使用することができます

NameTable nt = new NameTable(); 
NamespaceManager = new XmlNamespaceManager(nt); 

// Add prefix/namespace pairs to the XmlNamespaceManager. 
NamespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
NamespaceManager.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 
NamespaceManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");    
NamespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-07-14T13:45:59"); 
NamespaceManager.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");` 

をdecalreするには、このコードを持っている

を説明しよう

nav.Valueは、私が望むデータになります。

これは私のフォームテンプレートのいくつかでうまくいきます。私は新しいフォームテンプレートを作成し、代わりにこのラインを使用する必要があることを発見しました。

NamespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37"); 

日付が異なります。

私の問題は、1組のフォームしか動作しないため、これを2回追加できないということです。

私の質問はそうです。これは、ヘッダーにすべてが含まれているので、XMLファイルからNamespaceManagerオブジェクトを生成する方法はありますか? 私はこれを単純な方法で見つけることができませんでした。

答えて

4

含まれています。 "my"名前空間を追加する代わりに、XmlDocumentオブジェクトから取得することができます。これはちょうどこの方法で動作する運が少しかもしれませんが、私はそれに満足しています。

NamespaceManager.AddNamespace("my", formXml.DocumentElement.NamespaceURI 

formXMLはのInfoPath XML

+0

ありがとう自動生成されます。あなたがこれをやろうとしている唯一の人であるように思えます...もちろん私以外の人!それは理にかなっていません - ヘッダーにあるときに期待する名前空間をハードコーディングしなければならないのはなぜですか? – DFTR

0

このような操作は必要ありません。 2番目の名前空間には "my2"などを使用してください。新しい名前空間を使用するノードには新しい名前空間接頭辞が必要で、古い名前空間を引き続き使用するすべてのノードには古い "my"名前空間接頭辞を使用します。

+0

から作成されたXmlDocument私はあなたがInfoPathフォーム内の要素と名前空間の名前を管理しているとは思わないです - 彼らは – Vroomfundel

1

一つの選択肢)PushScopeを(呼び出して、それがどんな結果が得られていない場合は、最初の名前空間を使用してXMLノードをロードしようとするだろう、など、選択し、最初の名前空間の定義をオーバーライド...

var doc = new XmlDocument(); 


doc.LoadXml(@"<?xml version=""1.0""?> 
     <root xmlns:my=""http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37"" value=""1""> 
      <my:item>test</my:item> 
     </root>"); 


var nameTable = new NameTable(); 

var namespaceManager = new XmlNamespaceManager(nameTable); 


namespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

namespaceManager.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 

namespaceManager.AddNamespace("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution");    

namespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-07-14T13:45:59"); 

namespaceManager.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003"); 


// n will be null since the namespace url doesn't match 

var n = doc.SelectSingleNode("descendant::my:item", namespaceManager); 


namespaceManager.PushScope(); 

namespaceManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-11-30T17:39:37"); 


// will work 

n = doc.SelectSingleNode("descendant::my:item", namespaceManager); 


namespaceManager.PopScope(); 

別のオプションは、私がこれを行うための方法を見つけたヘッダ内の属性を解析し、任意のを探すために、名前空間

foreach(XmlAttribute attribute in doc.DocumentElement.Attributes) 
{ 
    var url = namespaceManager.LookupNamespace(attribute.LocalName); 

    if(url != null && url != attribute.Value) 
    { 
     namespaceManager.RemoveNamespace(attribute.LocalName, url); 
     namespaceManager.AddNamespace(attribute.LocalName, attribute.Value); 
    } 
} 
関連する問題