1

XML 文字列の読み取りに問題があります。ここで私は次のものを持っています:

<SplitterLayoutDataSet xmlns="http://tempuri.org/SplitterLayoutDataSet.xsd"> 
    <SplitterLayout> 
        <SplitterName>mainSplitContainerControl</SplitterName> 
            <SplitterPosition>0.2213375796178344</SplitterPosition> 
     </SplitterLayout> 
</SplitterLayoutDataSet>

<SplitterName>だから、私は次のコードでタグ を読みたい:

XmlElement rootElement = doc.DocumentElement;
rootElement.RemoveAllAttributes();
if (rootElement != null)
    {
        foreach (KeyValuePair<Control, object> key in SaveLayoutControls)
        {
            Control c = key.Key;
            XmlElement el = rootElement.SelectSingleNode("SplitterName") as XmlElement;
            if (el != null)
            {
                if (c is GridControl)
                    SetGridLayout(el, c as GridControl);
                else if (c is SplitContainerControl)
                    SetSplitContainerLayout(el, c as SplitContainerControl);
                else if (c is TreeList)
                    SetTreeListLayout(el, c as TreeList);
                else if (c is CollapsibleSplitter)
                    SetCollapsibleSplitterLayout(el, c as CollapsibleSplitter);
                else if (c is Splitter)
                    SetSplitterLayout(el, c as Splitter);
                }
            }
       }

「el」フィールドを読み取りたいのですが、NULL 値が返されます。この問題を解決するためのアイデアはありますか? いろいろ試したのに結果が出なかったからです。ありがとう

4

3 に答える 3

2

2 つの問題があります。

1) 名前空間のないSplitterName要素を要求していますが、XML ファイル内の要素は名前空間 URI を暗黙的に使用しています。"http://tempuri.org/SplitterLayoutDataSet.xsd"

2) document 要素の直下にノードを要求していますが、SplitterName要素の直接の子ではありませんSplitterLayoutDataSet

を使用してこれに XPath を使用することは間違いありませんXmlNamespaceManager、個人的には LINQ to XML を使用してみます。

XNamespace ns = "http://tempuri.org/SplitterLayoutDataSet.xsd";
XElement root = ...;
XElement names = root.Descendants(ns + "SplitterName").First();

key(さらに、検索のどこにも使用していないのに、繰り返しごとにその要素を検索する理由が明確ではありません...)

于 2013-04-02T18:15:41.660 に答える
0

XPath が正しい場所を指していません。

"SplitterName" xpath は、ルート要素の下にあるその要素をチェックします。

使用する

"//SplitterName" または "//SplitterLayout/SplitterName" または "\SplitterLayoutDataSet/SplitterLayout/SplitterName"

AND xmlns="zzz" を削除するか、名前空間が追加され、"//ns:SplitterName" などの XPath 要素がプレフィックスとして付けられたクエリに NamespaceManager を追加します。

于 2013-04-02T18:15:22.063 に答える
0

OK、解決策を見つけました。名前空間を使用しようとしましたが、コードのこの部分は正常に動作するようになりました。以下はコードのサンプルです。

    XmlDocument doc = new XmlDocument();
    doc.InnerXml = xml;
    XmlElement rootElement = doc.DocumentElement as XmlElement;
    XmlNamespaceManager xns = new XmlNamespaceManager(doc.NameTable);
    xns.AddNamespace("ns", "http://tempuri.org/SplitterLayoutDataSet.xsd");
    if (rootElement != null)
    {
        foreach (KeyValuePair<Control, object> key in SaveLayoutControls)
        {
            Control c = key.Key;
            XmlElement el = rootElement.SelectSingleNode("ns:SplitterLayout", xns) as XmlElement;
            if (el != null)
            {
                if (c is GridControl)
                    SetGridLayout(el, c as GridControl);
                else if (c is SplitContainerControl)
                    SetSplitContainerLayout(el, c as SplitContainerControl);
                else if (c is TreeList)
                    SetTreeListLayout(el, c as TreeList);
                else if (c is CollapsibleSplitter)
                    SetCollapsibleSplitterLayout(el, c as CollapsibleSplitter);
                else if (c is Splitter)
                    SetSplitterLayout(el, c as Splitter);
            }
        }
    }
于 2013-04-03T13:05:12.667 に答える