标签: xml-namespaces

文档类型声明和命名空间


\n\n

我\xe2\x80\x99是 XML 的新手,目前正在学习文档类型声明。无论如何,在 DTD 正文中声明元素时,元素名称必须与 XML 文档中的完全相同,包括任何命名空间前缀,这意味着用户可以\xe2\x80\x99 定义自己的命名空间,但必须使用前缀在 DTD 中定义。

\n\n

a) 我假设即使我们必须使用 DTD 中定义的前缀,我们仍然可以选择这些前缀指向哪些 URI?

\n\n


\n\n

b) 假设我们(在 DTD 中)声明一个元素,其中 pers 是命名空间前缀,这是否意味着 XML 文档中该元素的所有出现都需要包含前缀 \xe2\x80\x9cpers\xe2\x80\x9d?如果是这样的话,那就意味着通过 DTD,我们可以\xe2\x80\x99t 使用默认的命名空间功能?!

\n\n


\n\n

谢谢

\n\n


\n\n

编辑:

\n\n


\n\n

A)

\n\n
\n

实际上,除非有特别充分的理由,或者您有简单的语法要求并且不需要命名空间,否则您应该考虑使用 XML 模式。

\n
\n\n

我确实计划改用 XML Schema,但我\xe2\x80\x99d 也喜欢学习 DTD 的基础知识。

\n\n


\n\n

b)

\n\n
\n

\xe2\x80\xa6 没有命名空间 URI 的概念(也没有默认命名空间)。

\n
\n\n

如果我们在 DTD 中声明名为 \xe2\x80\x9cxmlns\xe2\x80\x9d 的属性:

\n\n
<!ATTLIST contact xmlns CDATA #REQUIRED> \n
Run Code Online (Sandbox Code Playgroud)\n\n


\n\n

那么XML文档可以使用默认命名空间功能(这里子元素<name>位于默认命名空间中): …

xml dtd xml-namespaces

1
推荐指数
1
解决办法
2602
查看次数

让声明的命名空间生效

我试图在外部CSS(实际上是两个单独的文件)中编写名称空间.当我在浏览器上运行该文件时,它将不使用声明的命名空间.我认为该文件正在调用css文件,但它没有应用命名空间样式

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?xml version="1.0" encoding="utf-8"?>


<html xmlns:act="http://www.superstarmovies.com/actors" 
  xmlns:mov="http://www.superstarmovies.com/movies"
  xmlns="http://www.w3.org/1999/xhtml" >

<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<title>Superstar Movies: Stars of the Month</title>
<link rel="stylesheet" href="movies.css"  type="text/css" ?>
<link rel="stylesheet" href="actors.css" type="text/css" ?>
<link rel="stylesheet" href="superstar.css" type="text/css" />
</head>

<body>
<div id="heading"><img src="logo.gif" alt="Superstar Movies" /></div>

<div id="main">
<h1>Stars of the Month</h1>
<h3>Movies by Our Featured Stars!</h3>
<act:actors>

    <act:actor>
        <act:name>Halle Berry</act:name>
    <act:date>August 14, 1966</act:date>
    <act:birthplace>Cleveland, Ohio</act:birthplace>
          <mov:movie genre="action" star="Halle Berry">
        <mov:name>Catwoman</mov:name>
    <mov:date>(2004)</mov:date>
    <mov:length>104 …
Run Code Online (Sandbox Code Playgroud)

html css xml xhtml xml-namespaces

1
推荐指数
1
解决办法
830
查看次数

如何选择使用默认命名空间的节点?

XML文件的结构大致如下:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="url1" xsi:schemaLocation="url2 url3">
   <b>
     <c></c>
     <c></c>
     <c></c>
   </b>
</a>
Run Code Online (Sandbox Code Playgroud)

我的目标是选择所有“c”元素,但以下 xpath 表达式不起作用:“//a/b/c”。

IE:

XmlDocument doc= new XmlDocument();
doc.Load(filepath);
XmlNodeList l = doc.SelectNodes("//a/b/c"); // 0 nodes
Run Code Online (Sandbox Code Playgroud)

我测试过的唯一有效的 xpath 表达式是 /*(1 个节点)和 //*(所有节点)。

这个问题是否与 XML 命名空间有关?如果是这样,设置 XMLDocument 对象的正确方法是什么?

        XmlDocument doc= new XmlDocument();
        doc.Load(filepath);
        XmlNamespaceManager m = new XmlNamespaceManager(doc.NameTable);
        m.AddNamespace(/* what goes here? */);
        XmlNodeList l = doc.SelectNodes("//a/b/c", m);
Run Code Online (Sandbox Code Playgroud)

c# xml xpath xsd xml-namespaces

1
推荐指数
1
解决办法
1759
查看次数

如何从 PHP 中的 XML 中删除所有命名空间(标签和属性)

我最近对 ​​XML 名称空间和在 PHP 中有效地处理它们感到非常悲痛。这是最糟糕的罪魁祸首的示例:

<dc:type xsi:type="TypeName" xsi:identifier="NN">Others</dc:type>
Run Code Online (Sandbox Code Playgroud)

我使用 preg_replace 成功做到的是使用以下方法“取消命名空间”标签(不破坏 URL):

$xml = preg_replace(
  '/<(\/?)([^:" ].*):([^>\/ ].*)(\/?)>/msiU',
  '<$1$2_$3$4>',
  $x->readOuterXML()
);

# <dc_type xsi:type="TypeName" xsi:identifier="NN">Others</dc_type>
Run Code Online (Sandbox Code Playgroud)

我不能做的事情——由于缺乏正则表达式魔法——是将所有命名空间属性转换为相同的格式。我设法转换了第一次出现,但不知道如何设置可重复的条件。我删除了代码,因为它不起作用(我不记得我做了什么),但结果是这样的:

<dc_type xsi_type="TypeName" xsi:identifier="NN">Others</dc_type>
Run Code Online (Sandbox Code Playgroud)

而美丽的是这样的:

<dc_type xsi_type="TypeName" xsi_identifier="NN">Others</dc_type>
Run Code Online (Sandbox Code Playgroud)

有没有正则表达式大师可以提供帮助?

php regex xml xml-namespaces xml-parsing

1
推荐指数
1
解决办法
5336
查看次数

如何使用D3.js指定自定义XML/SVG命名空间?

我试图在SVG中定义自己的命名空间,所以我可以使用自己的标签和属性.如果我理解正确,SVG应如下所示:

<svg xmlns:myns="http://www.example.com/whatever/">
  <g myns:mycustomattr="123">
    ... 
Run Code Online (Sandbox Code Playgroud)

我通过D3添加根SVG元素,但添加了一个名称空间attr失败:

var svg = d3.select("#container")
  .append("svg")
    .attr('xmlns:myns', 'http://www.example.com/whatever/') 
Run Code Online (Sandbox Code Playgroud)

上面的代码导致:NamespaceError:尝试以对名称空间不正确的方式创建或更改对象

使用D3.js将名称空间添加到SVG的正确方法是什么?

svg xml-namespaces d3.js

1
推荐指数
1
解决办法
2068
查看次数

如何在LINQ to XML中选择具有命名空间的XML节点

我有一个以下格式的xml文档.

<Abc xmlns="http://qusetons.com/Cdc/AbcSchema.xsd">
  <xxx>False</xxx>
  <yyy>True</yyy>
  <sss>Pd</sss>
</Abc>
Run Code Online (Sandbox Code Playgroud)

我正在使用XDocument类来解析此文档

 var doc= XDocument.Load(fullfilepath);
Run Code Online (Sandbox Code Playgroud)

现在下面的代码来获取节点的值不起作用.我应该怎么做才能得到这个代码?

doc.XPathSelectElement("/Abc/xxx").value
Run Code Online (Sandbox Code Playgroud)

c# xml xml-namespaces

1
推荐指数
1
解决办法
2528
查看次数

删除包含 xmlns 属性的 XML 元素

我想使用 XSLT 从 XML 文件中删除名为“searchBookResponse”的元素(包装器 - 而不是它的后代)。

当“searchBookResponse”元素没有属性或非“xmlns”属性时,我的 XSLT 代码工作得很好。但是,有了这些 xmlns 属性,它就不再起作用了。

这是输入的 XML 文档:

<?xml version="1.0" encoding="utf-8"?>
<books>
  <searchBookResponse xmlns="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <book>
      <author>Tom</author>
      <title>Test</title>
    </book>
    <book>
      <author>David</author>
      <title>Test two</title>
    </book>
  </searchBookResponse>
  <book>
    <author>Anas</author>
    <title>Test two</title>
  </book>
  <book>
    <author>Jim</author>
    <title>Test two</title>
  </book>
</books>
Run Code Online (Sandbox Code Playgroud)

这是 XSL 样式表:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@xmlns" />


  <xsl:template match="searchBookResponse">
      <xsl:apply-templates select="node()" />
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

应用后,输出 XML 文件与输入 XML 文件相同。我必须先应用一些字符串模式匹配来删除 …

xml xslt namespaces xml-namespaces

1
推荐指数
1
解决办法
5073
查看次数

在Python中通过ElementTree解析xml时如何保留名称空间

假设我要使用Python修改以下XML ElementTree

<root xmlns:prefix="URI">
  <child company:name="***"/>
  ...
</root> 
Run Code Online (Sandbox Code Playgroud)

我正在对XML文件进行如下修改:

import xml.etree.ElementTree as ET
tree = ET.parse('filename.xml')
# XML modification here
# save the modifications
tree.write('filename.xml')
Run Code Online (Sandbox Code Playgroud)

然后,XML文件如下所示:

<root xmlns:ns0="URI">
  <child ns0:name="***"/>
  ...
</root>
Run Code Online (Sandbox Code Playgroud)

如您所见,namepsace prefix更改为ns0。我知道这里ET.register_namespace()提到的使用。

问题ET.register_namespace()在于:

  1. 你需要知道prefixURI
  2. 不能与默认名称空间一起使用。

例如,如果xml看起来像:

<root xmlns="http://uri">
    <child name="name">
    ...
    </child>
</root>
Run Code Online (Sandbox Code Playgroud)

它将转换为以下内容:

<ns0:root xmlns:ns0="http://uri">
    <ns0:child name="name">
    ...
    </ns0:child>
</ns0:root>
Run Code Online (Sandbox Code Playgroud)

如您所见,默认名称空间更改为ns0

有什么办法解决这个问题ElementTree吗?

python xml elementtree xml-namespaces xml-parsing

1
推荐指数
1
解决办法
701
查看次数

为什么XML序列化程序在使用命名空间的对象反序列化时返回null?

我有这个案子:

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public class Response
    {
        public string RetKey { get; set; }
        public string RetType { get; set; }
    }

    [Test]
    public void Test3()
    {
        {
            var s = @"<Response  CommandID=""57b48ae28f484ab4b3cc2e841cddd02a"">
    <RetKey>5</RetKey>
    <RetType>152</RetType>
    </Response>";

            var xmlSerializer = new XmlSerializer(typeof(Response));
            var deserialize = (Response)xmlSerializer.Deserialize(new StringReader(s));

            Assert.AreEqual("5", deserialize.RetKey, "no namespace");
        }

        {
            var s = @"<Response xmlns=""http://www.sap.com/SBO/DIS"" CommandID=""57b48ae28f484ab4b3cc2e841cddd02a"">
    <RetKey>5</RetKey>
    <RetType>152</RetType>
    </Response>";

            var xRoot = new XmlRootAttribute
            {
                ElementName …
Run Code Online (Sandbox Code Playgroud)

c# xml xml-namespaces

1
推荐指数
1
解决办法
116
查看次数

如何为 Azure tts (mstts) 设置命名空间

我需要为 Azure TTS 创建此标头:

 <speak version="1.0" 
  xmlns="https://www.w3.org/2001/10/synthesis" 
   xmlns:mstts="https://www.w3.org/2001/mstts" 
   xml:lang="en-US">
Run Code Online (Sandbox Code Playgroud)

这是用于创建 xml:lang 键的代码:

xml_body = ElementTree.Element('speak', version='1.0')
xml_body.set('{http://www.w3.org/XML/1998/namespace}lang', 'en-us')
Run Code Online (Sandbox Code Playgroud)

我试图创建 xmlns:mstts 没有成功。这不起作用:

xml_body.set('{https://www.w3.org/2001/10/synthesis}mstts', 'https://www.w3.org/2001/mstts' )
Run Code Online (Sandbox Code Playgroud)

因为这会产生以下输出:

 <speak version="1.0" 
  xmlns="https://www.w3.org/2001/10/synthesis" 
   xmlns:mstts="https://www.w3.org/2001/mstts" 
   xml:lang="en-US">
Run Code Online (Sandbox Code Playgroud)

请注意元素属性中的xmlns:ns0ns0:mstts问题<speak>

有任何想法吗?

python xml elementtree xml-namespaces

1
推荐指数
1
解决办法
209
查看次数

标签 统计

xml-namespaces ×10

xml ×9

c# ×3

elementtree ×2

python ×2

xml-parsing ×2

css ×1

d3.js ×1

dtd ×1

html ×1

namespaces ×1

php ×1

regex ×1

svg ×1

xhtml ×1

xpath ×1

xsd ×1

xslt ×1