标签: xml-namespaces

如何使用.NET XML API删除xmlns属性

XmlElement.Attributes.Remove*方法适用于任意属性,导致从XmlDocument.OuterXml属性中删除已删除的属性.然而,Xmlns属性是不同的.这是一个例子:

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1=""value1"" xmlns=""http://mynamespace.com/"" attr2=""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal={0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal={0}", doc.DocumentElement.Attributes["xmlns"]);
Run Code Online (Sandbox Code Playgroud)

结果输出是

xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1="value1" xmlns="http://mynamespace.com/" />
Run Code Online (Sandbox Code Playgroud)

该属性似乎从Attributes集合中删除,但不会从XmlDocument.OuterXml中删除.我想这是因为这个属性的特殊含义.

问题是如何使用.NET XML API删除xmlns属性.显然我可以从String的表示中删除该属性,但我想知道是否可以使用API​​执行相同的操作.

@Edit:我说的是.NET 2.0.

.net xml api xml-namespaces

8
推荐指数
1
解决办法
2万
查看次数

如何使用BeautifulSoup访问命名空间的XML元素?

我有一个XML文档,其内容如下:

<xml>
<web:Web>
<web:Total>4000</web:Total>
<web:Offset>0</web:Offset>
</web:Web>
</xml>
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何使用像python中的BeautifulSoup这样的库来访问它们?

xmlDom.web ["Web"].总计?不起作用?

python xml beautifulsoup xml-namespaces xml-parsing

8
推荐指数
2
解决办法
6829
查看次数

在JAXB中控制名称空间前缀

jaxb如何确定编组对象的命名空间前缀声明列表?我使用xjc为ebics(ebics schema)编译java类.当我为ebicsRequest创建一个实例时,它看起来像这样:


<?xml version="1.0" encoding="UTF-16"?>
<ns2:ebicsRequest xmlns:ns2="http://www.ebics.org/H003" Revision="1" Version="H003" xmlns="http://www.ebics.org/H003" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ns4="http://www.ebics.org/S001" xmlns:ns5="http://www.ebics.org/H000">
    <ns2:header authenticate="true">
        <ns2:static>
            <ns2:HostID>SIZBN001</ns2:HostID>
            <ns2:Nonce>A5488F43223063171CA0FA59ADC635F0</ns2:Nonce>
            <ns2:Timestamp>2009-08-04T08:41:56.967Z</ns2:Timestamp>
            <ns2:PartnerID>EBICS</ns2:PartnerID>
            <ns2:UserID>EBIX</ns2:UserID>
            <ns2:Product Language="de">EBICS-Kernel V2.0.4, SIZ/PPI</ns2:Product>
            <ns2:OrderDetails>
                <ns2:OrderType>FTB</ns2:OrderType>
                <ns2:OrderID>A037</ns2:OrderID>
                <ns2:OrderAttribute>OZHNN</ns2:OrderAttribute>
                <ns2:StandardOrderParams/>
            </ns2:OrderDetails>
            <ns2:BankPubKeyDigests>
                <ns2:Authentication Algorithm="RSA" Version="X002">...</ns2:Authentication>
                <ns2:Encryption Algorithm="RSA" Version="E002">...</ns2:Encryption>
            </ns2:BankPubKeyDigests>
            <ns2:SecurityMedium>0000</ns2:SecurityMedium>
            <ns2:NumSegments>1</ns2:NumSegments>
        </ns2:static>
        <ns2:mutable>
            <ns2:TransactionPhase>Initialisation</ns2:TransactionPhase>
        </ns2:mutable>
    </ns2:header>
    <ns2:AuthSignature>
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="#xpointer(//*[@authenticate='true'])">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>CSbjPbiNcFqSl6lCI1weK5x1nMeCH5bTQq5pedq5uI0=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>...</ds:SignatureValue>
    </ns2:AuthSignature>
    <ns2:body>
        <ns2:DataTransfer>
            <ns2:DataEncryptionInfo authenticate="true">
                <ns2:EncryptionPubKeyDigest Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" Version="E002">dFAYe281vj9NB7w+VoWIdfHnjY9hNbZLbHsDOu76QAE=</ns2:EncryptionPubKeyDigest>
                <ns2:TransactionKey>...</ns2:TransactionKey>
            </ns2:DataEncryptionInfo>
            <ns2:SignatureData authenticate="true">...</ns2:SignatureData>
        </ns2:DataTransfer>
    </ns2:body> …
Run Code Online (Sandbox Code Playgroud)

java xml jaxb xml-namespaces

8
推荐指数
2
解决办法
3万
查看次数

使用lxml解析HTML时如何保留命名空间信息?

>>> from lxml.etree import HTML, tostring
>>> tostring(HTML('<fb:like>'))
'<html><body><like/></body></html>'
Run Code Online (Sandbox Code Playgroud)

注意标签如何变为<fb:like>简单<like>.

这使得处理包含XFBML和lxml的页面变得更加困难.(同样的事情发生<g:plusone></g:plusone>)

任何帮助表示赞赏.

html python lxml xml-namespaces facebook-like

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

使用XPath选择不带名称空间的节点

我有一个像xml的

<root xmlns:ns1="http://foo">
    <ns1:child1>Text</ns1:child1>
    <ns1:child2>Number</ns1:child2>
</root>
Run Code Online (Sandbox Code Playgroud)

现在我从不同的人那里得到这个,所以例如人2给我发送了另一个具有相同结构的消息

<root xmlns:anotherNs="http://foo">
    <anotherNs:child1>Another Text</anotherNs:child1>
    <anotherNs:child2>Another Number</anotherNs:child2>
</root>
Run Code Online (Sandbox Code Playgroud)

所以唯一的区别是名称空间的名称.如何使用一个XPath表达式为两个xml选择child2的内容​​?

像"/ root/child2"或"// child2"这样的东西不起作用.

xpath xml-namespaces

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

查询具有xmlns节点属性的XML数据类型

我有以下SQL查询:

DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed><Product><Name>Foo</Name></Product></Feed>'

SELECT  x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
Run Code Online (Sandbox Code Playgroud)

返回:

Name
----
Foo
Run Code Online (Sandbox Code Playgroud)

但是,如果我的<Feed>节点有一个xmlns属性,那么这不会返回任何结果:

DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed xmlns="bar"><Product><Name>Foo</Name></Product></Feed>'

SELECT  x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
Run Code Online (Sandbox Code Playgroud)

返回:

Name
----
Run Code Online (Sandbox Code Playgroud)

这只有在我有一个xmlns属性,其他任何工作正常时才会发生.

为什么会这样,如何修改我的SQL查询以返回结果而不管属性如何?

xml sql sql-server xml-namespaces sql-server-2008

8
推荐指数
2
解决办法
9153
查看次数

为什么Visual Studio不喜欢这个XML模式?(前缀''无法映射到为"xml"或"xmlns"保留的命名空间名称)

FictionBook(也称为FB2)是一种基于XML的电子书格式.它的架构可以在这里找到:

http://gribuser.ru/xml/fictionbook/2.0/xsd/

但是,当我下载此架构并尝试在Visual Studio 2012中打开它时,我遇到了一堆错误,第一个错误是:前缀''无法映射到为"xml"或"xmlns"保留的命名空间名称.第5行,第118位.E:\ dev\fb2\FictionBook2.xsd.

架构真的无效吗?如果是这样,很多软件如何使用它来验证FB2文件?是否有一种简单的方法来修改架构以使VS快乐?

xsd xml-namespaces visual-studio visual-studio-2012 fb2

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

如何在PowerShell中使用带有命名空间的xpath访问元素?

电源外壳:

$doc = new-object System.Xml.XmlDocument
$doc.Load($filename)

$items = Select-Xml -Xml $doc -XPath '//item'
$items | foreach {
    $item = $_
    write-host $item.name
}
Run Code Online (Sandbox Code Playgroud)

我没有输出

XML:

<?xml version="1.0" encoding="UTF-8"?>
<submission version="2.0" type="TREE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="TREE.xsd" xmlns="some/kind/of/tree/v1">
  <group>
    <item></item>
    <item></item>
    <item></item>
  </group>
<submission>
Run Code Online (Sandbox Code Playgroud)

xml powershell xpath xml-namespaces

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

在Python中解析带有未声明前缀的XML

我正在尝试使用使用前缀的Python解析XML数据,但并非每个文件都具有前缀声明。XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<item subtype="bla">
    <thing>Word</thing>
    <abc:thing2>Another Word</abc:thing2>
</item>
Run Code Online (Sandbox Code Playgroud)

我一直在使用xml.etree.ElementTree解析这些文件,但是只要未正确声明前缀,ElementTree就会引发解析错误。(unbound prefix,位于的开头<abc:thing2>)。搜索此错误将导致我提出解决方案,建议我修复名称空间声明。但是,我无法控制需要使用的XML,因此修改输入文件不是一个可行的选择。

通常,搜索名称空间解析会使我想到许多与以名称空间无关的方式进行搜索的问题,这不是我所需要的。

我正在寻找一种自动解析这些文件的方法,即使名称空间声明已损坏。我已经考虑过要执行以下操作:

  • 告诉ElementTree事先要有哪些名称空间,因为我确实知道会出现哪些名称空间。我发现register_namespace,但这似乎不起作用。
  • 在解析之前先读取完整的DTD,然后看是否可以解决。我找不到用ElementTree做到这一点的方法。
  • 告诉ElementTree根本不用理会名称空间。它不会导致我的数据出现问题,但是我发现没有办法这样做
  • 使用其他可以解决此问题的解析库-尽管我不希望安装额外的库。我很难从文档中查看是否有其他人能够解决我的问题。
  • 我目前看不到的其他路线?

更新:在Har07使我走上的道路之后lxml,我试图查看这是否可以执行我曾想到的不同解决方案,其结果将是:

  • 告诉解析器事先要有什么名称空间:我仍然找不到任何“官方”方式来做到这一点,但是在搜索之前,我发现只是简单地以编程方式向数据添加必需声明的建议。(对于另一种编程情况-不幸的是我找不到链接了)对我来说似乎很骇客,但我还是尝试了一下。它涉及将数据作为字符串加载,更改包围元素以具有正确的xmlns声明,然后将其传递给lxml.etreefromstring方法。不幸的是,这还需要从字符串中删除对编码声明的所有引用。虽然可以。
  • 阅读在DTD解析之前:这是可能的lxml(通过attribute_defaultsdtd_validationload_dtd),但遗憾的是没有解决的命名空间的问题。
  • 告诉您lxml不要打扰名称空间:可以通过该recover选项进行操作。不幸的是,这也忽略了破坏XML的其他方式(有关详细信息,请参见Har07的答案)。

python xml parsing namespaces xml-namespaces

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

XmlSerializer +抽象类+派生类=无用的命名空间

关于SO的第一个问题:,)它是关于XmlSerializer和命名空间问题的.

我知道如何从Xml文件的根元素中删除默认的Xml命名空间已经有很多主题,而且它不是主题.

我的问题是当你使用派生类时如何从子节点中删除它?

我已经创建了自己的序列化程序,可以使用自定义命名空间或只是忽略它们,并且它对根元素很有效.

但是当我使用抽象类在List中列出一些派生类时,序列化插入2属性在每个派生类的节点内.

像这样 :

<root>
  <elements>
    <element p3:type="XmlDerivedClass" xmlns:p3="{schema_url}" >
    </element>
  </elements>
</root>
Run Code Online (Sandbox Code Playgroud)

至于我的班级:

// Root element
[XmlRoot("root", Namespace="")]
public class XmlRootElement
{
    List<XmlBaseClass> _Elements;
}    

// Base class
[XmlInclude(typeof(XmlDerivedClass))] // Mandatory, prevents serialization errors
[XmlRoot(Namespace="")]
public abstract class XmlBaseClass

// Derived class
[XmlRoot("element", Namespace="")]
public class XmlDerivedClass : XmlBaseClass
Run Code Online (Sandbox Code Playgroud)

我试过一些常见的解决方案

  • 使用Namespace =""属性
  • 实现XmlNamespaceDeclarations属性(使用右空命名空间)
  • XmlRoot()从base clase移动到派生的clase
  • XmlRoot()更改为XmlElement()

我将尝试在List上添加XmlInclude标记,以查看它是否发生了变化.

到目前为止,没有任何方法可以删除那些该死的命名空间......

如果有人有解决方案,我会很高兴尝试.

[编辑21/02/2014] 好吧,我似乎是唯一一个面临这个问题的人.我将使用一个简单的 …

.net c# xml serialization xml-namespaces

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