私はこのコードを持っています:
/*string theXml =
@"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/
string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>";
XDocument xmlElements = XDocument.Parse(theXml);
var elements = from data in xmlElements.Descendants("Result")
select new {
TheBool = (bool)data.Element("TheBool"),
TheId = (int)data.Element("TheId"),
};
foreach (var element in elements)
{
Console.WriteLine(element.TheBool);
Console.WriteLine(element.TheId);
}
TheXmlの最初の値を使用すると、結果はnullになりますが、2番目の値では良い値が得られます...
Linq to XMLをxmlns値で使用する方法は?
Descendants
やElement
などのLINQ to XMLメソッドは、XName
を引数として取ります。自動的に行われているstring
からXName
への変換があります。これを修正するには、XNamespace
およびDescendants
呼び出しの文字列の前にElement
を追加します。作業中の2つの異なる名前空間があるので注意してください。
string theXml =
@"true1";
//string theXml = @"true1";
XDocument xmlElements = XDocument.Parse( theXml );
XNamespace ns = "http://myvalue.com";
XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";
var elements = from data in xmlElements.Descendants( ns + "Result" )
select new
{
TheBool = (bool) data.Element( nsa + "TheBool" ),
TheId = (int) data.Element( nsa + "TheId" ),
};
foreach ( var element in elements )
{
Console.WriteLine( element.TheBool );
Console.WriteLine( element.TheId );
}
Descendants
でnsを、Elements
でnsaを使用していることに注意してください。
XName と名前空間を Descendants() および Element() に渡すことができます。文字列をDescendants()に渡すと、名前空間のないXNameに暗黙的に変換されます。
名前空間にXNameを作成するには、XNamespaceを作成し、それを要素local-name(文字列)に連結します。
XNamespace ns = "http://myvalue.com";
XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";
var elements = from data in xmlElements.Descendants( ns + "Result")
select new
{
TheBool = (bool)data.Element( nsa + "TheBool"),
TheId = (int)data.Element( nsa + "TheId"),
};
文字列からの暗黙的な変換を介して名前空間を持つXNameを作成するための短縮形もあります。
var elements = from data in xmlElements.Descendants("{http://myvalue.com}Result")
select new
{
TheBool = (bool)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheBool"),
TheId = (int)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheId"),
};
または、XElementに対してクエリを実行できます。 Name.LocalName 。
var elements = from data in xmlElements.Descendants()
where data.Name.LocalName == "Result"
XMLドキュメントの先頭にいくつかの名前空間がリストされていますが、どの要素がどの名前空間からのものであるかはあまり気にしません。要素を名前で取得したいだけです。この拡張メソッドを作成しました。
/// <summary>
/// A list of XElement descendent elements with the supplied local name (ignoring any namespace), or null if the element is not found.
/// </summary>
public static IEnumerable<XElement> FindDescendants(this XElement likeThis, string elementName) {
var result = likeThis.Descendants().Where(ele=>ele.Name.LocalName==elementName);
return result;
}
VB.NETの名前空間を持つ属性を読み取るために、次のコードが正常に機能することがわかりました。
MyXElement.Attribute(MyXElement.GetNamespaceOfPrefix("YOUR_NAMESPACE_HERE") + "YOUR_ATTRIB_NAME")
これが将来の誰かを助けることを願っています。