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.
我有一个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"].总计?不起作用?
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) >>> 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>)
任何帮助表示赞赏.
我有一个像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"这样的东西不起作用.
我有以下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查询以返回结果而不管属性如何?
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快乐?
电源外壳:
$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) 我正在尝试使用使用前缀的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,因此修改输入文件不是一个可行的选择。
通常,搜索名称空间解析会使我想到许多与以名称空间无关的方式进行搜索的问题,这不是我所需要的。
我正在寻找一种自动解析这些文件的方法,即使名称空间声明已损坏。我已经考虑过要执行以下操作:
register_namespace,但这似乎不起作用。更新:在Har07使我走上的道路之后lxml,我试图查看这是否可以执行我曾想到的不同解决方案,其结果将是:
xmlns声明,然后将其传递给lxml.etree的fromstring方法。不幸的是,这还需要从字符串中删除对编码声明的所有引用。虽然可以。lxml(通过attribute_defaults,dtd_validation或load_dtd),但遗憾的是没有解决的命名空间的问题。lxml不要打扰名称空间:可以通过该recover选项进行操作。不幸的是,这也忽略了破坏XML的其他方式(有关详细信息,请参见Har07的答案)。关于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)
我试过一些常见的解决方案
我将尝试在List上添加XmlInclude标记,以查看它是否发生了变化.
到目前为止,没有任何方法可以删除那些该死的命名空间......
如果有人有解决方案,我会很高兴尝试.
[编辑21/02/2014] 好吧,我似乎是唯一一个面临这个问题的人.我将使用一个简单的 …
xml-namespaces ×10
xml ×7
python ×3
.net ×2
xpath ×2
api ×1
c# ×1
fb2 ×1
html ×1
java ×1
jaxb ×1
lxml ×1
namespaces ×1
parsing ×1
powershell ×1
sql ×1
sql-server ×1
xml-parsing ×1
xsd ×1