1

次の XML 'テンプレート' があるとします。

<Request module="CRM" call="list_service_features" id="{ID}">
  <block name="auth">
     <a name="username" format="text">{USERNAME}</a>
     <a name="password" format="password">{PASSWORD}</a>
     <a name="client-id" format="counting">{CLIENT-ID}</a>
  </block>
  <a name="service-id" format="counting">{SERVICE-ID}</a>
</Request>

XDocument を使用して、中かっこで値を設定する最良の方法は何ですか。ここまでたどり着きましたが、要素<a />内の 3 つのノードのそれぞれを選択する最善の方法に行き詰まりました。<block/>これは XML のほんの一部であり、最大 20 個<a name="..."></a>の要素を持つものもあります。

XML の構築方法は私の創作ではありません。これは、サプライヤの「Web サービス」に送信する必要があるものです...誰かが format="counting" 属性を笑う前に :)

@David - 感謝します。私はそれがもう少しエレガントで、次のようなものになることを望んでいました:

List<XElement> e = doc.Descendants("a").ToList();
e.Where(x => x.Attributes("name") == "username").Single().Value = "abc";
e.Where(x => x.Attributes("name") == "password").Single().Value = "abc";

<a>上記のコードは明らかに機能しませんが、タグごとにエレガントなワンライナーがあると思いました

4

1 に答える 1

3

これはあなたのためにそれをしますか?古き良き子孫の財産。

string xmlInput = ...;
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XElement> someElements = myDoc.Descendants("a").ToList();
someElements.ForEach(x => x.Value = "Foo");
//
Console.WriteLine(myDoc);

うーん、そこに属性があるようですね。それもできます:

string xmlInput = //...
XDocument myDoc = XDocument.Parse(xmlInput);
//
List<XText> someText =
  myDoc.Descendants()
  .Nodes()
  .OfType<XText>()
  .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
  .ToList();
//
List<XAttribute> someAttributes =
  myDoc.Descendants()
  .Attributes()
  .Where(x => x.Value.StartsWith("{") && x.Value.EndsWith("}"))
  .ToList();
//
someText.ForEach(x => x.Value = "Foo");
someAttributes.ForEach(x => x.Value = "Bar");
//
Console.WriteLine(myDoc);

ああ、あなたが期待していることで、私はそれを機能させます:

List<XElement> e = myDoc.Descendants("a").ToList();
e.Where(x => x.Attribute("name").Value == "username").Single().Value = "abc";
e.Where(x => x.Attribute("name").Value == "password").Single().Value = "abc";
于 2008-11-18T19:44:15.657 に答える