-2

処理する必要がある特定の XML ファイルがあります。議論のために、すでに文字列としてロードしたとしましょう。

<?xml version="1.0" encoding="UTF-8" ?> 
<GROUP ID="_group_id" ORDERINFO="00000" TITLE="Group 1">
  <GROUP ID="_group_id_2" TITLE="Group 2">
    <LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" /> 
    <LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" /> 
  </GROUP>
  <GROUP ID="_group_id_3" TITLE="Group 3">
    <LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" /> 
    <LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" /> 
  </GROUP>
</GROUP>

特定の XML ファイルには、多数の LO と多数の GROUP が含まれる場合があります。いろいろな方法を試しましたが、うまくいきませんでした。特定の文字列に ID で一致する LO を見つけ、対応する TYPE と TITLE を文字列に取得して、それらを処理に使用できるようにするものが必要です。

ファイルを XmlDocument に読み込もうとしましたが、読み込まれると、適切な要素を見つける方法がわかりませんでした。

編集前の投稿で申し訳ありません - 一部のテキストが途切れています

4

5 に答える 5

4

XmlDocumentまたはを使用XDocumentして Xml を解析できます。

を使用した例を次に示しXDocumentます。

データクラス:

public class Lo
{
    public string Id { get; set; }
    public string Lang { get; set; }
    public string Type { get; set; }
    public string Title { get; set; }
}

コード:

var document = XDocument.Parse(data);

var value = "_id_code1";

IEnumerable<Lo> result = 
    document.XPathSelectElements(".//LO")
            .Where(x => x.Attribute("ID").Value == value)
            .Select(x =>
                new Lo
                {
                    Id = x.Attribute("ID").Value,
                    Lang = x.Attribute("LANG").Value,
                    Type = x.Attribute("TYPE").Value,
                    Title = x.Attribute("TITLE").Value
                });
于 2013-06-18T19:32:16.343 に答える
2

XmlDocument に読み込まれると、XPath を使用してメモを見つけることができます。

例えば:

XmlNode group = xmlDocument.SelectSingleNode("/GROUP/GROUP[@ID='_group_id_2']");

または:

XmlNodeList groups = xmlDocument.SelectNodes("/GROUP/GROUP");
foreach(XmlNode group in groups)
{
    string id = group.Attributes["ID"].Value;

}

これはとても簡単だ。より完全な手順については、インターネットを検索する必要があります。

于 2013-06-18T19:27:30.857 に答える
1

ドキュメントを参照してください。

于 2013-06-18T19:33:50.907 に答える
0

私はこれのために小さなテストアプリケーションを行いました.xmlを文字列として含めました.

            var xmlMessage = @"keep your xml here, I removed due to formatting";
        var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");
        foreach (var el in matchedElements)
        {
            Console.WriteLine("ElementName : {0}\nID = {1}\nLANG = {2}\nTYPE = {3}\nTITLE = {4}\n"
                , el.Name.LocalName, el.Attribute("ID").Value, el.Attribute("LANG").Value, el.Attribute("TYPE").Value, el.Attribute("TITLE").Value);

         }

これは、GROUP 要素に関係なく、ID「_id_code」を持つすべての LO 要素を取得するのに役立ちます。グループを考慮する必要がある場合は、2 行目のコードを次のように置き換えます。

var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Parent != null && el.Parent.Attribute("ID").Value == "_group_id_2" && el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");

ここでは、「_group_id_2」を確認しています。グループ ID に置き換えることができます。

必要な名前空間:

using System.Linq;
using System.Xml;
using System.Xml.Linq;
于 2013-06-18T20:08:30.137 に答える
0

文字列にキャストXAtributeしてから、そのValueプロパティにアクセスすることをお勧めします (属性が見つからない場合は、null代わりに例外を取得します)。また、クエリ構文はここでよりコンパクトです

string id = "_id_code1";
XDocument xdoc = XDocument.Parse(xml);

var query = from lo in xdoc.Descendants("LO")
            where (string)lo.Attribute("ID") == id
            select new {
                Id = (string)lo.Attribute("ID"),
                Language = (string)lo.Attribute("LANG"),
                Type = (string)lo.Attribute("TYPE"),
                Title = (string)lo.Attribute("TITLE")
            };

このクエリは、プロパティ Id、Language、Type、Title を持つ匿名オブジェクトのシーケンスを返します。で列挙できますforeach

于 2013-06-18T19:44:36.860 に答える