3

デフォルトの名前空間と名前空間を含むXMLドキュメントを作成するのに問題があり、作成しようとしているものを簡単に説明するのは難しいです...

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book title="Enders Game" author="Orson Scott Card" />
  <Book title="I Robot" author="Isaac Asimov" />
</Root>

しかし、私が最終的にするのはこれです...

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book p3:title="Enders Game" p3:author="Orson Scott Card" xmlns:p3="http://www.adventure-works.com" />
  <Book p3:title="I Robot" p3:author="Isaac Asimov" xmlns:p3="http://www.adventure-works.com" />
</Root>

このXMLスニペットを生成するために私が書いたコードはこれです...

  XNamespace aw = "http://www.adventure-works.com";
  XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
  XElement root = new XElement(aw + "Root",
      new XAttribute("xmlns", "http://www.adventure-works.com"),
      new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
      new XAttribute(xsi + "SchemaLocation", "http://www.SomeLocatation.Com/MySchemaDoc.xsd"),

      new XElement(aw + "Book",
        new XAttribute(aw + "title", "Enders Game"),
        new XAttribute(aw + "author", "Orson Scott Card")),
      new XElement(aw + "Book",
        new XAttribute(aw + "title", "I Robot"),
        new XAttribute(aw + "author", "Isaac Asimov")));

MSDNの例に基づく

****編集****

さて、もう少し実験を重ねると、XML名前空間がどのように機能するかについて非常に混乱しています。

aw +属性を削除すると、私が求めていたものが得られます...しかし、今、私が求めていたものは、実際には私が期待したものではないようです。名前空間は親から継承されていると思いましたが、これは属性にも当てはまりませんか?なぜなら、属性を読み取るこのコードは、期待どおりに機能しないからです...

  XElement xe = XElement.Parse(textBox1.Text);
  XNamespace aw = "http://www.adventure-works.com";
  var qry = from x in xe.Descendants(aw + "Book")
            select (string)x.Attribute(aw + "author");

ただし、属性のaw +を削除すると、そのokになり、デフォルトの名前空間に属性を含めることができないと思い込ませます。これは正しいです?

4

2 に答える 2

6

良い質問。私は少し掘り下げて、XML仕様のこのビットを見つけました:

デフォルトの名前空間宣言は、スコープ内の接頭辞のないすべての要素名に適用されます。デフォルトの名前空間宣言は、属性名に直接適用されません。接頭辞のない属性の解釈は、それらが表示される要素によって決定されます。

後でこの例を示します。

たとえば、次の場合、不正な空の要素タグはそれぞれ不正です。

<!-- http://www.w3.org is bound to n1 and n2 -->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <bad n1:a="1"  n2:a="2" />
</x>

ただし、次のそれぞれが有効です。2つ目は、デフォルトの名前空間が属性名に適用されないためです。

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <good a="1"     n1:a="2" />
</x>

したがって、基本的に、属性名はデフォルトで名前空間を取得しないように見えます。これは、これまでに見たすべてのことを説明しています:)

于 2009-08-05T07:18:16.647 に答える
1
XElement doc = XElement.Parse(ToXml());
doc.DescendantsAndSelf().Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
var ele = doc.DescendantsAndSelf();
foreach (var el in ele)
    el.Name = ns != null ? ns + el.Name.LocalName : el.Name.LocalName;

答えを見つけようとして 2 日間を費やした他の人のために。

于 2011-11-28T16:06:22.257 に答える