0

画像情報を含む XML データがあります。私の最初の目標は、フィルター処理されたものを作成することですXmlNodeList(例: すべての画像を返すcolor == yellow)。最終的な目標は、画像の名前のリストを返すことができるようにすることですcolor == yellow(フィルター処理された全体を返すことXmlNodeListは素晴らしいことですが、名前や ID など、そのフィルター処理されたリスト内の 1 つの要素だけが必要です)。

私の場合、ルート ノードは と呼ばれImages、各ノードを検索できるようにしたいと考えていImageます。私の XML データには XML 属性がないため、データのすべてのビットが要素として表されます (「黄色」の色を画像の属性ではなく、画像の子ノードにします)。

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Images xmlns="http://oec.api.opsource.net/schemas/server"
    xmlns:ns9="http://oec.api.opsource.net/schemas/multigeo"
    xmlns:ns5="http://oec.api.opsource.net/schemas/vip"
    xmlns:ns12="http://oec.api.opsource.net/schemas/storage"
    xmlns:ns6="http://oec.api.opsource.net/schemas/whitelabel"
    xmlns:ns13="http://oec.api.opsource.net/schemas/manualimport"
    xmlns:ns7="http://oec.api.opsource.net/schemas/datacenter"
    xmlns:ns10="http://oec.api.opsource.net/schemas/reset"
    xmlns:ns8="http://oec.api.opsource.net/schemas/general"
    xmlns:ns11="http://oec.api.opsource.net/schemas/support"
    xmlns:ns2="http://oec.api.opsource.net/schemas/directory"
    xmlns:ns4="http://oec.api.opsource.net/schemas/network"
    xmlns:ns3="http://oec.api.opsource.net/schemas/organization">
    <Image>
        <id>mcd93jf8dd</id>
        <name>cat</name>
        <color>yellow</color>
    </Image>
    <Image>
        <id>d4b8l23sas</id>
        <name>dog</name>
        <color>yellow</color>
    </Image>
</Images>

XML データの元のソースはストリームです。foreach ループを使用して XML 階層のさまざまなレベルを反復処理する方法を見つけましたが、子ノードで必要なすべてのメソッドを使用できないという問題に直面し続けています。他の場所のアドバイスはXPath、フィルターを実装するために使用することを提案しているようですが、これまでに得たものでそれを機能させることができませんでした:

C#

//'stream' previously defined as a Stream
XmlReader reader = XmlReader.Create(stream);
XmlDocument xml = new XmlDocument();
xml.Load(reader);
XmlElement root = xml.DocumentElement;
XmlNodeList images = root.ChildNodes;

foreach (XmlNode image in images) {

    XmlNodeList attributes = image.ChildNodes;

    foreach (XmlNode attribute in attributes) {
        //do stuff
    }

}
4

1 に答える 1

1

ここにいくつかのコードを投稿しました: http://ideone.com/jRFoBW以下のテクニックを示すために。XML がストリームから読み込まれるか文字列から直接読み込まれるかに違いはありませんが、ストリームから読み込まれるように設定して、条件を可能な限り再現しました。

XML は名前空間を使用するため、名前空間マネージャーを作成し、それに名前空間を追加する必要があります。

XmlNamespaceManager nsm = new XmlNamespaceManager(xml.NameTable);
// The prefix can be anything as long as you use it consistently
nsm.AddNamespace("i", "http://oec.api.opsource.net/schemas/server");

id次に、以下を実行して、黄色の およびのリストを取得できますname

XmlNodeList ids = xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']/i:id", nsm);
XmlNodeList names = xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']/i:name", nsm);

黄色の画像のidとの両方が必要な場合は、次のことをお勧めします。name

foreach(XmlNode yellowImage in xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']", nsm))
{
   string id = yellowImage.SelectSingleNode("i:id", nsm).InnerText;
   string name = yellowImage.SelectSingleNode("i:name", nsm).InnerText;

   // use id and name
}
于 2013-01-11T17:11:25.250 に答える