通过名称空间前缀访问名称空间

发布于 2024-11-05 11:33:06 字数 1099 浏览 0 评论 0原文

MSDN

使用 LINQ 的优点之一 XML 与 C# 的区别在于您不必 使用 XML 前缀。当 LINQ 到 XML 加载或解析 XML 文档,每个 XML 前缀被解析为它的 相应的 XML 命名空间。后 当您处理文档时 使用命名空间,你几乎 始终通过访问命名空间 命名空间 URI,而不是通过 命名空间前缀。当开发人员工作时 在 LINQ to XML 中使用 XML 名称 始终使用完全合格的 XML 名称(即 XML 命名空间和 本地名称)。

a) 嗯,上面的引用是否声称在 Linq to XML 中开发人员始终使用完全限定的 XML 名称,因此始终通过其命名空间 URI 而不是通过命名空间前缀访问命名空间?

但是下面的代码不是通过前缀而不是命名空间 URI 访问命名空间(并且我们不能也认为在这个示例中我们没有使用完全限定的 XML 名称):

XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;

b) 为什么在 Linq to XML 中访问通过命名空间 URI 访问命名空间比通过命名空间前缀访问它们更好?

谢谢

编辑:

您认为您的代码示例为何使用 前缀?

我不知道为什么我认为上面的代码使用了命名空间前缀。

1) 有没有办法通过前缀而不是命名空间 URI 访问命名空间(例如,当尝试使用 XElement.Elements(Xname) 方法查找子元素时)?

2)除了具有默认命名空间和同一命名空间的附加命名空间声明的文档之外,是否还有其他我应该注意的示例,当文档被序列化回来时,输入文档中的前缀可能不会被保留?

MSDN:

One of the advantages of using LINQ to
XML with C# is that you do not have to
use XML prefixes. When LINQ to XML
loads or parses an XML document, each
XML prefix is resolved to its
corresponding XML namespace. After
that, when you work with a document
that uses namespaces, you almost
always access the namespaces through
the namespace URI, and not through the
namespace prefix. When developers work
with XML names in LINQ to XML they
always work with a fully-qualified XML
name (that is, an XML namespace and a
local name).

a) Uhm, is the above quote claiming that in Linq to XML developers always work with fully-qualified XML names and thus always access namespaces through their namespace URI and not through namespace prefix?

But doesn't the following code access namespace through the prefix and not namespace URI ( and couldn't we also argue that in this example we aren't working with a fully qualified XML name ):

XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;

b) why would in Linq to XML accessing namespaces through namespace URI be preferable to accessing them through a namespace prefix?

thank you

EDIT:

Why do you think your code sample uses
a prefix?

I have no idea why I thought the above code uses a namespace prefix.

1) is there a way to access namespace through the prefix and not namespace URI ( for example, when trying to find child elements using XElement.Elements(Xname) method )?

2) Besides a document having both a default namespace and an additional namespace declaration for the same namespace, are there any other examples I should be aware of where prefixes in input document may not get preserved when document is serialized back?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

緦唸λ蓇 2024-11-12 11:33:06

您认为您的代码示例为什么使用前缀?它使用 XNamespace 对象,该对象表示 LINQ to XML 对象模型和 API 中命名空间的 XML 概念。当然,为了简化代码,XNamespace 存储在一个具有短名称的变量中,并且该变量用于构造 XName 作为 Elements 方法的参数,但我不知道任何前缀如何使用或如何使用任何方式的代码取决于 XML 输入中前缀的使用。
这是否回答了您问题的 a) 部分?

至于 b) 部分,在具有名称空间的 XML 中,语义上重要的是元素或属性所属的名称空间,前缀并不重要。 在语义上都没有任何区别

<root xmlns="http://example.com/ns1">
  <foo>bar</foo>
</root>

因此,无论您编写或

<pf1:root xmlns:pf1="http://example.com/ns1">
  <pf1:foo>bar</pf1:foo>
</pf1:root>

或 ,

<pf2:root xmlns:pf2="http://example.com/ns1">
  <pf2:foo>bar</pf2:foo>
</pf2:root>

并且使用 LINQ to XML 在这三个示例中选择任何元素节点对于所有三个示例都是相同的,您只需定义一个 XNamespace 对象

XNamespace ns1 = "http://example.com/ns1";

,然后就可以使用例如 Descendants (ns1 + "foo") 访问命名空间 http://example.com/ns1 中具有本地名称 foo 的元素。

这就是主要优点,您编写代码来根据元素或属性所属的命名空间来选择元素或属性,而不是根据某些输入文档中使用的任何前缀。

LINQ to XML 的前缀“无知”肯定存在缺点,例如,如果您有一个具有默认命名空间的文档,但同一命名空间有一个附加命名空间声明,那么命名空间声明的顺序似乎决定了 LINQ to XML 如何序列化该文档后退。下面是一个示例,演示了:

如果我们有两个 X(HT)ML 输入文档 XMLFile1.xml

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

和 XMLFile2.xml

<html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

,则 VS 2010/.NET 4.0 的输出为

<?xml version="1.0" encoding="ibm850"?>
<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en">
  <xhtml:head>
    <xhtml:title>Example</xhtml:title>
  </xhtml:head>
  <xhtml:body>
    <xhtml:h1>Example</xhtml:h1>
  </xhtml:body>
</xhtml:html>
<?xml version="1.0" encoding="ibm850"?>
<html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

因此,这肯定是 LINQ to XML 对象模型的一个缺点存储元素或属性节点的任何前缀,在这种情况下,当您加载并保存回来时,输入文档中的前缀可能不会被保留。

Why do you think your code sample uses a prefix? It uses an XNamespace object which is the representation of the XML concept of a namespace in the LINQ to XML object model and API. Of course for ease of code the XNamespace is stored in a variable with a short name and that variable is used to construct an XName as the argument to the Elements method but I don't see how any prefix is used or how the code in any way depends on the use of prefixes in the XML input.
Does that answer part a) of your question?

As for part b), what matters semantically in XML with namespaces is the namespace an element or attribute belongs to, prefixes don't matter. So it does not make any difference semantically whether you write

<root xmlns="http://example.com/ns1">
  <foo>bar</foo>
</root>

or

<pf1:root xmlns:pf1="http://example.com/ns1">
  <pf1:foo>bar</pf1:foo>
</pf1:root>

or

<pf2:root xmlns:pf2="http://example.com/ns1">
  <pf2:foo>bar</pf2:foo>
</pf2:root>

And selecting any element nodes in those three samples with LINQ to XML is the same for all three samples, you simply define an XNamespace object

XNamespace ns1 = "http://example.com/ns1";

and then you can use e.g. Descendants(ns1 + "foo") to access elements with local name foo in the namespace http://example.com/ns1.

So that is the main advantage, you write code to select elements or attributes based on the namespace they belong to, not based on any prefix used in certain input document.

There are certainly shortcomings in LINQ to XML's prefix "ignorance", for instance if you have a document with a default namespace but an additional namespace declaration for the same namespace then the order of the namespace declaration seems to decide how LINQ to XML serializes the document back. Below is a sample demonstrating that:

If we have two X(HT)ML input documents XMLFile1.xml

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

and XMLFile2.xml

<html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

then the output with VS 2010/.NET 4.0 is

<?xml version="1.0" encoding="ibm850"?>
<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en">
  <xhtml:head>
    <xhtml:title>Example</xhtml:title>
  </xhtml:head>
  <xhtml:body>
    <xhtml:h1>Example</xhtml:h1>
  </xhtml:body>
</xhtml:html>
<?xml version="1.0" encoding="ibm850"?>
<html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

So that certainly is a disadvantage of the LINQ to XML object model not storing any prefixes of element or attribute nodes, in that case the prefixes in the input document might not be preserved when you load and save back.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文