2

NodeList.SelectSingleNode()を正しく機能させるのに問題があります。私のXMLは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<inm:Results xmlns:inm="http://www.namespace.com/1.0">
    <inm:Recordset setCount="18254">
        <inm:Record setEntry="0">
            <!-- snip -->
            <inm:Image>fileName.jpg</inm:Image>
        </inm:Record>
    </inm:Recordset>
</inm:Results>

データは長い一連の<inm:Record>エントリです。

ドキュメントを開いて、「inm:Record」に基づいてNodeListオブジェクトを作成します。これはうまくいきます。

XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNodeList xRecord = xdoc.GetElementsByTagName("inm:Record");

forループを使用してNodeListのループを開始します。特定のエントリを処理する前に、が設定されているかどうかを確認したいと思い<inm:Image>ます。やるだけですごく簡単だと思いました

string strImage = xRecord[i].SelectSingleNode("inm:Image").InnerText;

私の考えは、「私が使用しているXRecordの場合、<inm:Image>値を見つけに行きます...しかし、XmlNameSpaceManagerが必要であるという例外が発生するため、これは機能しません。したがって、それを設定しようとしましたが、できませんでした。構文を正しく取得します。

この場合、誰かが正しいXmlNameSpaceManager構文を使用する方法を教えてもらえますか?

今のところ、特定のxRecordのすべてのchildNodeをループし、ループしたらタグをチェックすることで、この問題を回避しました。<inm:Record>最初にその値をチェックして、そのエントリをループする必要があるかどうかを確認したいと思います。

4

4 に答える 4

2

すべての Record 要素をループする必要はありません。XPath を使用して必要なサブセットを指定するだけです。

XmlDocument xdoc = new XmlDocument();
xdoc.Load(openFileDialog1.FileName);
XmlNamespaceManager manager = new XmlNamespaceManager(xdoc.NameTable);
manager.AddNamespace("inm", "http://www.inmagic.com/webpublisher/query");
XmlNodeList nodes = xdoc.SelectNodes("/inm:Results/inm:Recordset/inm:Record[inm:Image != '']", manager);
于 2012-06-26T17:35:30.657 に答える
0
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xdoc.NameTable);
string strImage = xRecord[i].SelectSingleNode("inm:Image",nsMgr).InnerText; 

やるべきです。

于 2012-06-26T17:23:20.663 に答える
0

LINQ to XMLライブラリを使用して、ノードの値を取得する例を次に示します。

XDocument doc = XDocument.Load(openFileDialog1.FileName);
List<XElement> docElements = doc.Elements().ToList();
XElement results = docElements.Elements().Where(
   ele => ele.Name.LocalName == "Results").First();
XElement firstRecord = results.Elements().Where(
   ele => ele.Name.LocalName == "Record").First();
XElement recordImage = firstRecord .Elements().Where(
   ele => ele.Name.LocalName == "Image").First();
string imageName = recordImage.Value;

ちなみに、型チェックされた言語にハンガリー語表記を使用するのはやり過ぎです。str常にstring. _

于 2012-06-26T17:27:55.123 に答える
0

このXml ライブラリを使用すると、Image 子要素を持つすべてのレコードを取得できます。

XElement root = XElement.Load(openFileDialog1.FileName);
XElement[] records = root.XPath("//Record[Image]").ToArray();

Image 子に値が含まれていることを確認したい場合は、次のように表現できます。

XElement[] records = root.XPath("//Record[Image != '']").ToArray();
于 2012-06-26T18:51:18.353 に答える