0

XMLの一部を抽出する必要があります。私のXMLファイルには数千のノードを含めることができます。その一部のみを取得し、この部分をxml文字列として使用したいと思います。

私のXML構造:

<ResponseMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ErrorResponse>
        <Code>SUCCESS</Code>
        <Message>Success</Message>
    </ErrorResponse>
    <OutputXml>
        <Response>
            <Product>
                <child1>xxx</child1>
                <child2>xxx</child2>
                ...
            </Product>
            <Product>
                <child1>xxx</child1>
                <child2>xxx</child2>
                ...
            </Product>
            ...
        </Response>
    </OutputXML>
</ResponseMessage>

次のようなWebサービスからXMLを取得しています。

...
System.Net.WebResponse wResponse = req.GetResponse();
reqstream = wResponse.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(reqstream);

System.Xml.Linq.XDocument xmlResponse = System.Xml.Linq.XDocument.Parse(reader.ReadToEnd());

次に、XMLをジェネリックコレクションに入れて、linqを使用して処理しようとしました。

int startIndex = 0;
int nbItem = 25;
System.Text.StringBuilder outputXml = new System.Text.StringBuilder();
System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> partialList =
   xmlResponse.Elements("Response").Skip(startIndex).Take(nbItem);

foreach (System.Xml.Linq.XElement x in partialList)
{
    outputXml.Append(x.ToString());
}

私の問題は、私のリストが常に空であるということです。

4

2 に答える 2

1

次のコードを使用して、LINQToXmlを使用できます。

IEnumerable<XElement> elements = xmlResponse.Root.Element("OutputXml").Element("Response").Elements("Product");

foreach(XElement element in elements)
{
    // Do Work Here
}

これにより、リストが製品のみにフィルターされ、インデックスを使用せずに正しく選択されます。xmlは変更される可能性があるため、xmlでインデックスを使用することは最善の方法ではありません。

于 2012-12-14T01:41:18.300 に答える
0

XPathEvaluateを使用してサブツリーを読み取ることができます。

リストが空の場合は、名前空間の問題である可能性が高いため、コードでこの名前空間を考慮していませんxmlns:i="http://www.w3.org/2001/XMLSchema-instance"XDocument/XElement名前空間を自動的に解決できません。

LINQ-to-XMLで名前空間を使用する方法については、このトピックを参照してください。

于 2012-12-14T02:07:58.727 に答える