私はXMLにLINQで完全修飾要素名を使用する必要がないようすることができますか?

StackOverflow https://stackoverflow.com/questions/898394

  •  23-08-2019
  •  | 
  •  

質問

私は、次のXML文字列を持つXElement.Parse()を呼び出して言ってます:

var xml = XElement.Parse(@"
  <?xml version="1.0" encoding="UTF-8"?>
  <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
      <ID>7c75442509c41100b6a413b88b523bd6f46554cdbee5b6cbe27bc08cb3f6a865</ID>
      <DisplayName>me</DisplayName>
    </Owner>
    <AccessControlList>
      <Grant>
        <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
      ...
  ");
それは要素を照会する時間が来ると、

、私はそのXML文書はそのルートにxmlns属性が含まれているため、完全修飾要素名を使用するように強制しています。これは、のXNameインスタンスの面倒な作品を必要とします:

var AWS_XMLNS = "http://s3.amazonaws.com/doc/2006-03-01/";
var ownerElement = xml.Element(XName.Get("AccessControlPolicy", AWS_XMLNS)).Element(XName.Get("Owner", AWS_XMLNS));

私が本当にしたいことは、単純である場合には、

var ownerElement = xml.Element("AccessControlPolicy").Element("Owner");

XMLにLINQを作るための方法ですが、のように私はそれを指定しておく必要はありませんの特定の名前空間を想定?

役に立ちましたか?

解決

私はあなたが(ジョンスキートの<のhref = "https://stackoverflow.com/questions/793580/my-linq-query-doesnt-work-when-adding-the-xmlns-attributeを見ることができるとは思いません-to-ルート要素イン/ 793601#793601" >コメントの)、しかし、あなたが行うことができますいくつかのトリックがあります。

1)あなたの文字列にXNamespaceを追加する拡張メソッドを作成します。

2) VB <使用します/>?!?

他のヒント

あなたが使用して簡素化することができます。

XNamespace ns = "http://s3.amazonaws.com/doc/2006-03-01/";
var ownerElement = xml.Element(ns + "AccessControlPolicy").Element(ns + "Owner");
scroll top