web-dev-qa-db-ja.com

XmlDocumentを使用してXML属性を読み取る

C#のXmlDocumentを使用してXML属性を読み取るにはどうすればよいですか?

次のようなXMLファイルがあります。

<?xml version="1.0" encoding="utf-8" ?>
<MyConfiguration xmlns="http://tempuri.org/myOwnSchema.xsd" SuperNumber="1" SuperString="whipcream">
    <Other stuff />
</MyConfiguration> 

XML属性SuperNumberとSuperStringをどのように読みますか?

現在、私はXmlDocumentを使用していますが、XmlDocumentのGetElementsByTagName()を使用してその間の値を取得していますが、これは非常にうまく機能します。属性を取得する方法がわかりません。

75
Alex
XmlNodeList elemList = doc.GetElementsByTagName(...);
for (int i = 0; i < elemList.Count; i++)
{
    string attrVal = elemList[i].Attributes["SuperString"].Value;
}
106
Arsen Mkrtchyan

XPath を調べる必要があります。使用を開始すると、リストを反復処理するよりもはるかに効率的で簡単にコーディングできることがわかります。また、必要なものを直接取得できます。

次に、コードは次のようなものになります

string attrVal = doc.SelectSingleNode("/MyConfiguration/@SuperNumber").Value;

XPath 3.0は2014年4月8日にW3C勧告になりました。

87
Greg

XmlDocumentの代わりにXDocumentに移行し、その構文が必要な場合はLinqを使用できます。何かのようなもの:

var q = (from myConfig in xDoc.Elements("MyConfiguration")
         select myConfig.Attribute("SuperString").Value)
         .First();
8
Matt Sherman

Xmlファイルbooks.xmlがあります

<ParameterDBConfig>
    <ID Definition="1" />
</ParameterDBConfig>

プログラム:

XmlDocument doc = new XmlDocument();
doc.Load("D:/siva/books.xml");
XmlNodeList elemList = doc.GetElementsByTagName("ID");     
for (int i = 0; i < elemList.Count; i++)     
{
    string attrVal = elemList[i].Attributes["Definition"].Value;
}

これで、attrValの値はIDになります。

6
siva

XmlDocument.Attributesおそらく? (私は常に属性コレクションを繰り返してきましたが、おそらくあなたが望むことを行うメソッドGetNamedItemがあります)

5
jerryjvl

XMLに名前空間が含まれている場合、属性の値を取得するために以下を実行できます。

var xmlDoc = new XmlDocument();

// content is your XML as string
xmlDoc.LoadXml(content);

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());

// make sure the namespace identifier, URN in this case, matches what you have in your XML 
nsmgr.AddNamespace("ns", "urn:oasis:names:tc:SAML:2.0:protocol");

// get the value of Destination attribute from within the Response node with a prefix who's identifier is "urn:oasis:names:tc:SAML:2.0:protocol" using XPath
var str = xmlDoc.SelectSingleNode("/ns:Response/@Destination", nsmgr);
if (str != null)
{
    Console.WriteLine(str.Value);
}

XML名前空間の詳細 here および here

1
Voicu

サンプルドキュメントが文字列変数docにあると仮定します

> XDocument.Parse(doc).Root.Attribute("SuperNumber")
1
1
Colonel Panic