我使用 CXF 2.3.0 来托管服务,但服务的响应如下所示
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<responseElement xmlns="http://xxx/yyyy.wsdl/types/">
<result>
Run Code Online (Sandbox Code Playgroud)
但想要的是
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://xxx/yyyy.wsdl/types/">
<env:Body>
<ns0:responseElement>
<ns0:result>
Run Code Online (Sandbox Code Playgroud)
我有一个 package-info 类,它声明元素命名空间是合格的。我还有什么需要做的吗?
考虑以下输入 xml 文档:
<oracle:EMP xmlns:oracle="http://www.oracle.com/xml"/>
Run Code Online (Sandbox Code Playgroud)
...以及以下处理程序:
final class XMLizatorSaxHandler extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println(uri + "," + localName + "," + qName);
}
}
Run Code Online (Sandbox Code Playgroud)
当将它与 a 一起使用时,SAXParser我预计会出现以下输出:
uri: http://www.oracle.com/xml
localName: EMP
qName: oracle:EMP
Run Code Online (Sandbox Code Playgroud)
但我得到的是这个:
uri:
localName:
qName: oracle:EMP
Run Code Online (Sandbox Code Playgroud)
为什么?我怎样才能得到正确的信息?
我如何创建以下内容XElement?
<data name="MyKey" xml:space="preserve">
<value>Date of birth</value>
<comment>Some comment</comment>
</data>
Run Code Online (Sandbox Code Playgroud)
它抛出
“‘:’字符(十六进制值 0x3A)不能包含在名称中。”
var data = new XElement("data");
data.Add(new XAttribute("name", translation.Key));
data.Add(new XAttribute("xml:space", "preserve")); // <-- here is the error
data.Add(new XElement("value") { Value = "Date of birth" });
data.Add(new XElement("comment") { Value = "Some comment" });
Run Code Online (Sandbox Code Playgroud)
由于这是文件的一部分ResX,因此会有许多这样的<data></data>元素。
我需要从此 xml 中提取名称值(产品查找器):
文件:config.xml
<?xml version="1.0" encoding="utf-8"?>
<widget id="com.abc.app" version="1.3.1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0" ios-CFBundleVersion="1.3.1.5" android-versionCode="5">
<name>Product Finder</name>
<description>
Description
</description>
</widget>
Run Code Online (Sandbox Code Playgroud)
我试过了:
mles$ xmllint --xpath "/widget/name/text()" config.xml
XPath set is empty
Run Code Online (Sandbox Code Playgroud)
这可能是因为我的config.xml文件有其他命名空间。根据这个问题,我需要手动设置名称空间。所以我尝试过:
mles$ xmllint --shell config.xml / > setns x=http://www.w3.org/ns/widgets / > xpath /x:widget/name/text
Run Code Online (Sandbox Code Playgroud)
这一项上没有任何输出。使用 xmllint 提取名称值的正确语法是什么?
注意:我已经有了grep 和 sed 的解决方案,但我想使用 xmllint。
使用 XmlSerializer 类,我想实现以下结果 XML:
<n:root xmlns:n="http://foo.bar">
<child/>
</n:root>
Run Code Online (Sandbox Code Playgroud)
请注意,根已定义命名空间和前缀,但子级没有。我设法使用以下 XSLT 来做到这一点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="n:root" xmlns:n="http://foo.bar">
<xsl:element name="child" />
</xsl:element >
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
...但是我想在类上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个类:
[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
[XmlElement(ElementName = "child")]
public Child Child { get; set; }
}
public class Child {}
Run Code Online (Sandbox Code Playgroud)
然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces 类对其进行序列化:
public string Foo()
{
var root = new Root { Child = new Child() };
var ns = …Run Code Online (Sandbox Code Playgroud) 如何<content:encoded> ... </content:encoded>使用scrapy XPath 从RSS 提要中提取内容(示例如下)?
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Latest – Reason.com</title>
<item>
<pubDate>Thu, 16 Jan 2020 21:40:23 +0000</pubDate>
<content:encoded><![CDATA[<p><span style="font-weight: 400">
Jimmy Meders was scheduled to die by lethal injection today,
but the Georgia parole board has granted him clemency.</span></p>]]>
</content:encoded>
...
Run Code Online (Sandbox Code Playgroud)
我试过了response.xpath('//content:encoded').get(),但它不起作用。
任何帮助都受到高度赞赏。
我使用 lxml 从具有命名空间的外部服务解析 XML,但未将它们注册到xmlns. 我正在尝试手动注册它register_namespace,但这似乎不起作用。
from lxml import etree
xml = """
<Foo xsi:type="xsd:string">bar</Foo>
"""
etree.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
el = etree.fromstring(xml) # lxml.etree.XMLSyntaxError: Namespace prefix xsi for type on Foo is not defined
Run Code Online (Sandbox Code Playgroud)
我缺少什么?奇怪的是,查看 lxml 源代码来尝试理解我可能做错了什么,似乎xsi命名空间应该已经作为默认命名空间之一存在。
我正在使用 lxml 生成最终用作播客的 RSS 提要。这意味着我需要添加命名空间元素,例如<itunes:duration>和<itunes:subtitle>。但我在尝试弄清楚如何使用 lxml 动态创建此类元素时遇到了很多麻烦。
如果我简单地尝试:
from lxml import etree
element = etree.Element("itunes:duration")
Run Code Online (Sandbox Code Playgroud)
我明白了:
ValueError: Invalid tag name 'itunes:duration'
Run Code Online (Sandbox Code Playgroud)
接下来我尝试了这个并且更接近了:
from lxml import etree
etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element("{itunes}duration")
print(etree.tostring(element).decode("utf-8"))
Run Code Online (Sandbox Code Playgroud)
然而,这导致了这个输出:
<ns0:duration xmlns:ns0="itunes"/>
Run Code Online (Sandbox Code Playgroud)
因此,虽然这比例外要好,但它显然仍然是不对的。如何创建itunes:标签名称中带有前缀的元素?
我的问题很简单.我正在为需要具有名称空间前缀的SOAP请求添加标头.因此,我正在使用
QName(String namespaceURI,
String localPart,
String prefix)
Run Code Online (Sandbox Code Playgroud)
问题是虽然我设置了前缀,但没有添加任何内容,即:
new QName("http://lit.com/schemas/Bobsled", "bob:sessionId")
Run Code Online (Sandbox Code Playgroud)
我明白了 <bob:sessionId xmlns="http://lit.com/schemas/Bobsled">
并使用前缀:
new QName("http://lit.com/schemas/Bobsled", "bob:sessionId","bob")
Run Code Online (Sandbox Code Playgroud)
它应该是完全相同的,它应该是:
<bob:sessionId xmlns:bob="http://lit.com/schemas/Bobsled">
Run Code Online (Sandbox Code Playgroud)
...似乎构造函数中的前缀没有做任何事情!
我有一个旧的VB.NET Web应用程序项目,我正在转换为C#.我已经使用SharpDevelop转换了大部分应用程序但是遇到了转换一些特殊情况代码的问题:
' Namespace
Imports <xmlns:items="urn:list_items">
' Code:
Dim group = From items In ListItems...<items:item> _
Where items.<item.name> = "Something"
Select names = items.<item.name>
Run Code Online (Sandbox Code Playgroud)
我不知道VB.NET使用XML模式的方法的C#等价物.有没有一种方法可以导入模式并使用相同的LINQ语句?
编辑:
让我通过一个循环的部分是转换(通过SharpDevelop)Imports <xmlns:items="urn:list_items">到using urn:list_items.编译器抱怨这种语法.
我很好奇是否有一个C#等价的指令来导入XML模式并将其用作LINQ查询的一部分,但考虑到C#不像VB.NET那样支持XML文字,它不是相关.