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

Xml 通过名称空间前缀访问名称空间,xml,linq-to-xml,xml-namespaces,Xml,Linq To Xml,Xml Namespaces,: 使用LINQ的优点之一是 XML和C是您不必使用的 使用XML前缀。当LINQ转换为XML时 加载或解析XML文档,每个 XML前缀解析为其 对应的XML名称空间。之后 当您处理文档时 使用名称空间,您几乎可以 始终通过访问名称空间 命名空间URI,而不是通过 名称空间前缀。当开发人员工作时 使用LINQ to XML中的XML名称 始终使用完全限定的XML 名称,即XML名称空间和 本地名称 嗯,上面的引文是否声称在LINQtoXML中,开发人员总是使用完全限定的XML名称,因此总是通过其

:

使用LINQ的优点之一是 XML和C是您不必使用的 使用XML前缀。当LINQ转换为XML时 加载或解析XML文档,每个 XML前缀解析为其 对应的XML名称空间。之后 当您处理文档时 使用名称空间,您几乎可以 始终通过访问名称空间 命名空间URI,而不是通过 名称空间前缀。当开发人员工作时 使用LINQ to XML中的XML名称 始终使用完全限定的XML 名称,即XML名称空间和 本地名称

嗯,上面的引文是否声称在LINQtoXML中,开发人员总是使用完全限定的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例如,当尝试使用XElement.ElementsXname方法查找子元素时,是否有通过前缀而不是命名空间URI访问命名空间的方法


2除了对同一名称空间同时具有默认名称空间和附加名称空间声明的文档外,我是否还应该知道在将文档序列化回来时,输入文档中的前缀可能无法保留的其他示例

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

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

<root xmlns="http://example.com/ns1">
  <foo>bar</foo>
</root>
然后,您可以使用例如子代sns1+foo来访问命名空间中具有本地名称foo的元素http://example.com/ns1.

因此,这是主要的优势,您可以编写代码,根据元素或属性所属的名称空间来选择它们,而不是基于某些输入文档中使用的任何前缀

LINQtoXML的前缀忽略当然有缺点,例如,如果您有一个文档具有默认名称空间,但有一个相同名称空间的附加名称空间声明,那么名称空间声明的顺序似乎决定了LINQtoXML如何将文档序列化回来。以下是一个示例,证明:

如果我们有两个XHTML输入文档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对象模型不存储元素或属性节点的任何前缀的缺点,在这种情况下,在加载和保存时,输入文档中的前缀可能不会被保留。

您好,我知道您已经回答了我最初的问题,但是您能看到我的编辑吗?我计划在一两天内将你的帖子标记为答案
<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>
<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>
<?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>