さまざまな XML スキームが作成されるクラスがあります。オプションの要素と属性の条件演算子を使用して、1 つの (非常に長い) ステートメントでさまざまな動的 XDocuments を作成します。
XDocuments をクラスに変換する必要がありますが、それらは異なるスキームからのものであるため、多くの要素とサブ要素はオプションである可能性があります。これを行う唯一の方法は、多くの if ステートメントを使用することです。
このアプローチはあまり LINQ とは思えず、XDocument を作成するときよりもはるかに多くのコードを使用するため、これを行うためのより良い方法があるかどうか疑問に思いました。
例は、取得することです
<?xml version="1.0"?>
<root xmlns="somenamespace">
<object attribute1="This is Optional" attribute2="This is required">
<element1>Required</element1>
<element1>Optional</element1>
<List1>
Optional List Of Elements
</List1>
<List2>
Required List Of Elements
</List2>
</object>
</root>
の中へ
public class Object()
{
public string Attribute1;
public string Attribute2;
public string Element1;
public string Element2;
public List<ListItem1> List1;
public List<ListItem2> List2;
}
これよりも LINQ に適した方法で:
public bool ParseXDocument(string xml)
{
XNamespace xn = "somenamespace";
XDocument document = XDocument.Parse(xml);
XElement elementRoot = description.Element(xn + "root");
if (elementRoot != null)
{
//Get Object Element
XElement elementObject = elementRoot.Element(xn + "object");
if(elementObject != null)
{
if(elementObject.Attribute(xn + "attribute1") != null)
{
Attribute1 = elementObject.Attribute(xn + "attribute1");
}
if(elementObject.Attribute(xn + "attribute2") != null)
{
Attribute2 = elementObject.Attribute(xn + "attribute2");
}
else
{
//This is a required Attribute so return false
return false;
}
//If, If/Elses get deeper and deeper for the next elements and lists etc....
}
else
{
//Object is a required element so return false
return false;
}
}
else
{
//Root is a required element so return false
return false;
}
return true;
}
更新: ParseXDocument メソッドが「オブジェクト」クラス内にあることを明確にするためです。xml ドキュメントを受信するたびに、Object クラス インスタンスの値の一部またはすべてが更新されます。