2

次のコードを使用して要素の数を検索し、検索はデフォルト パスがない場合にのみ成功します。

検索するコード:

XElement root = XElement.Load(@"c:\b.txt", LoadOptions.PreserveWhitespace);
IEnumerable<XElement> address =
             from el in root.Elements("Address")
              select el;
int c = address.Count();

c の値は 2 で、次のデータがあります。

<?xml version="1.0" encoding="UTF-8"?>
<presence xmlns:a="urn:ietf:params:xml:ns:pidf"
  xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model"
  xmlns:oma="urn:xml:prs:pidf:oma-pres"
  entity="sip:john@police.city.gov">
  <Address Type="Shipping">
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </Address>
  <Address Type="Billing">
    <Name>Tai Yee</Name>
    <Street>8 Oak Avenue</Street>
    <City>Old Town</City>
    <State>PA</State>
    <Zip>95819</Zip>
    <Country>USA</Country>
  </Address>
</presence>

しかし、2 行目を次のように交換して XML を変更すると (xmlns:a ではなく xmlns):

 <presence xmlns="urn:ietf:params:xml:ns:pidf"

値 0 を取得しましたが、これは正しくありません。

なにか提案を?

ありがとう

4

2 に答える 2

4

xmlns="urn:ietf:params:xml:ns:pidf"名前空間が指定されていない、xml 内のすべての要素にデフォルトの名前空間を設定することを意味します。

その結果、次のように名前空間宣言を LINQ to XML クエリに追加する必要もあります。

XElement root = XElement.Load(@"c:\b.txt", LoadOptions.PreserveWhitespace);

XNamespace xmlns = "urn:ietf:params:xml:ns:pidf";

IEnumerable<XElement> address = root.Elements(xmlns + "Address");

Console.WriteLine(address.Count()); //prints 2

または、名前空間に依存しないアプローチを使用できます。これは、指定されているデフォルトの名前空間に関係なく機能します。

var address = root.Elements()
                  .Where(node => node.Name.LocalName == "Address");
//address will contain the same nodes, as in previous example

また、そのような場合、拡張メソッドの構文ははるかにクリーンであることに注意してください。

于 2013-05-22T10:04:03.877 に答える
4

xmlns="urn:ietf:params:xml:ns:pidf" を設定すると、すべての要素のデフォルトの名前空間が設定されます。したがって、「Address」要素は存在しなくなりました。現在は「urn:ietf:params:xml:ns:pidf:Address」と呼ばれています。

XNamespace を宣言し、それを要素名に追加する必要があります。

XNamespace defaultNamespace = "urn:ietf:params:xml:ns:pidf";
XElement root = XElement.Load(@"c:\b.txt", LoadOptions.PreserveWhitespace);
IEnumerable<XElement> address =
             from el in root.Elements(defaultNamespace + "Address")
              select el;
int c = address.Count();
于 2013-05-22T10:05:02.367 に答える