我正在尝试使用类似于此示例的lxml指定命名空间(取自此处):
<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</TreeInventory>
Run Code Online (Sandbox Code Playgroud)
我不确定如何添加要使用的Schema实例以及Schema位置.该文件让我开始,这样做是这样的:
>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
>>> TREE = '{%s}' % NS
>>> NSMAP = {None: NS}
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP)
>>> etree.tostring(tree, pretty_print=True)
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n'
Run Code Online (Sandbox Code Playgroud)
我不知道如何指定它是一个实例,然后还指定一个位置.看来这可以用nsmap关键字-arg 来完成etree.Element,但我不知道怎么做.
我在这里查了很多答案,我想我差不多了.有一件事困扰着我(由于某些原因,我的同伴需要它)如下:
<?xml version="1.0" encoding="utf-8"?>
<MyRoot>
<MyRequest CompletionCode="0" CustomerID="9999999999"/>
<List TotalList="1">
<Order CustomerID="999999999" OrderNo="0000000001" Status="Shipped">
<BillToAddress ZipCode="22221"/>
<ShipToAddress ZipCode="22222"/>
<Totals Tax="0.50" SubTotal="10.00" Shipping="4.95"/>
</Order>
</List>
<Errors/>
</MyRoot>
Run Code Online (Sandbox Code Playgroud)
<ns:MyNewRoot xmlns:ns="http://schemas.foo.com/response"
xmlns:N1="http://schemas.foo.com/request"
xmlns:N2="http://schemas.foo.com/details">
<N1:MyRequest CompletionCode="0" CustomerID="9999999999"/>
<ns:List TotalList="1">
<N2:Order CustomerID="999999999" Level="Preferred" Status="Shipped">
<N2:BillToAddress ZipCode="22221"/>
<N2:ShipToAddress ZipCode="22222"/>
<N2:Totals Tax="0.50" SubTotal="10.00" Shipping="4.95"/>
</N2:Order>
</ns:List>
<ns:Errors/>
</ns:MyNewRoot>
Run Code Online (Sandbox Code Playgroud)
注意N2:Order的子节点还需要N2:前缀以及其余元素的ns:前缀.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/MyRoot">
<MyNewRoot xmlns="http://schemas.foo.com/response"
xmlns:N1="http://schemas.foo.com/request"
xmlns:N2="http://schemas.foo.com/details">
<xsl:apply-templates/>
</MyNewRoot> …Run Code Online (Sandbox Code Playgroud) 有点懒,我很高兴发现我可以通过New - > Servlet来创建一个新的servlet源代码,而不是去New - > Class然后将类编辑成一个servlet.
但是,我发现每次在Eclipse中创建一个新的servlet时,Eclipse都会修改我的web.xml.
具体来说,它将top元素修改为:
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
id="WebApp_ID" version="2.4">
Run Code Online (Sandbox Code Playgroud)
(我的线路爆炸.)
这似乎并不一定是坏事,但它通过在其名称前面加上"javaee:"来修改各种子元素,以指示这些元素属于该命名空间.
例如,它会改变
<display-name>ShowLifecycles</display-name>
Run Code Online (Sandbox Code Playgroud)
至
<javaee:display-name>ShowLifecycles</javaee:display-name>
Run Code Online (Sandbox Code Playgroud)
之后,eclipse会抱怨它修改的所有元素,给我一些符号:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'javaee:display-name'. One of '{"http://
java.sun.com/xml/ns/j2ee":description, "http://java.sun.com/xml/ns/j2ee":display-name, "http://java.sun.com/xml/ns/
j2ee":icon, "http://java.sun.com/xml/ns/j2ee":distributable, "http://java.sun.com/xml/ns/j2ee":context-param, "http://
java.sun.com/xml/ns/j2ee":filter, "http://java.sun.com/xml/ns/j2ee":filter-mapping, "http://java.sun.com/xml/ns/
j2ee":listener, "http://java.sun.com/xml/ns/j2ee":servlet, "http://java.sun.com/xml/ns/j2ee":servlet-mapping, "http://
java.sun.com/xml/ns/j2ee":session-config, "http://java.sun.com/xml/ns/j2ee":mime-mapping, "http://java.sun.com/xml/ns/
j2ee":welcome-file-list, "http://java.sun.com/xml/ns/j2ee":error-page, "http://java.sun.com/xml/ns/j2ee":jsp-config, "http://
java.sun.com/xml/ns/j2ee":security-constraint, "http://java.sun.com/xml/ns/j2ee":login-config, "http://java.sun.com/xml/ns/
j2ee":security-role, "http://java.sun.com/xml/ns/j2ee":env-entry, "http://java.sun.com/xml/ns/j2ee":ejb-ref, "http://
java.sun.com/xml/ns/j2ee":ejb-local-ref, "http://java.sun.com/xml/ns/j2ee":service-ref, "http://java.sun.com/xml/ns/
j2ee":resource-ref, "http://java.sun.com/xml/ns/j2ee":resource-env-ref, "http://java.sun.com/xml/ns/j2ee":message-
destination-ref, "http://java.sun.com/xml/ns/j2ee":message-destination, "http://java.sun.com/xml/ns/j2ee":locale-
encoding-mapping-list}' is expected.
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,当我使用find和replace将所有内容删除到"javaee:"中时,Eclipse仍会抱怨这些文件,即使它们不再存在.我必须将整个剩余文件复制并粘贴到自身之上,以避免这些投诉.
我确信Eclipse正在努力发挥作用,期待这个命名空间的一些愿望或需求.我怎样才能做以下两件事之一: …
我见过类似的问题,但我还不清楚.我不希望"n1"命名空间出现在输出文件中节点的属性中.但我必须在xslt文件中创建"n1"命名空间才能使xpath正常工作.谢谢.
XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:n1="http://www.spicefactory.org/parsley"
xmlns="http://www.spicefactory.org/parsley"
>
<xsl:output method="xml" indent="no"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="n1:object[@type='mytype1']">
<object type="mytype2">
<xsl:apply-templates select="node()"/>
</object>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
从OUTPUT XML文件中获取:
<object type="mytype2" xmlns:n1="http://www.spicefactory.org/parsley">
Run Code Online (Sandbox Code Playgroud) 一个简单的XHTML文档,具有最少的必需标记:和xmlns属性具有http链接.
如果我正在使用localhost,如果我没有Internet连接,我不能使用XHTML吗?
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Title of the document</title>
</head>
<body>
The content of the document......
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 让我们考虑这个 xml 数据
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Run Code Online (Sandbox Code Playgroud)
这里 h 的 NURI:“ http://www.w3.org/TR/html4/ ”
f 的 NURI:“ http://www.w3schools.com/furniture ”
NURI(命名空间 URI)到底意味着什么?有必要吗?。它实际上包含什么?
关于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] 好吧,我似乎是唯一一个面临这个问题的人.我将使用一个简单的 …
我想xlink:href在 XHTML 中使用属性设置元素的样式,但是我无法使其工作。我的测试代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xyz="http://xyz.org">
<head>
<meta charset="UTF-8" />
<title>css namespace</title>
<style>
body { font-size: 20px; } /* Oops! A normal rule must not precede @namespace rules! */
@namespace html "http://www.w3.org/1999/xhtml";
@namespace xlink "http://www.w3.org/1999/xlink";
@namespace xyz "http://xyz.org";
html|p {
color: blue;
}
[xlink|href], [xyz|href] {
cursor: pointer;
text-decoration: underline;
color: red;
}
xyz|p, xyz {
display: block;
}
</style>
</head>
<body>
<!-- typos: 'xref' should be 'href', thank BoltClock's answer! -->
<p xlink:xref="aaa"><p xlink:xref …Run Code Online (Sandbox Code Playgroud) 我试图XmlReader在一次传递中处理一个大的XML文档(使用a ),并使用一个反序列化其中的某些元素XmlSerializer.
下面是一些代码和一个微小的模拟XML文档,显示了我是如何尝试这样做的.
使用的基本原理
XmlReader: 1.我正在处理非常大的XML文档(10-250 MB),因此我不想加载到内存中.所以XmlDocument是不可能的.2.我想只提取某些元素.通常,我将能够忽略大多数其他内容.XmlReader似乎给了我一种跳过不相关内容的有效方法.3.我不提前知道是否有任何我能应付将出现的所有元素; 因此,我没有使用一堆Xpath/XQuery或LINQ到基于XML的查询,因为我只想对XML文件进行一次传递(由于它们的大小).
public class ElementOfInterest { }
…
var xml = @"<?xml version='1.0' encoding='utf-8' ?>
<Root xmlns:ex='urn:stakx:example'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<ElementOfInterest xsi:type='ex:ElementOfInterest' />
</Root>";
var reader = System.Xml.XmlReader.Create(new System.IO.StringReader(xml));
reader.ReadToFollowing("ElementOfInterest");
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(ElementOfInterest));
serializer.Deserialize(reader.ReadSubtree());
Run Code Online (Sandbox Code Playgroud)
最后一行代码抛出以下内部异常:
InvalidOperationException:"ex未定义名称空间前缀."
显然,XmlSerializer不识别属性值ex内的名称空间前缀xsi:type.
这只是我遇到的一个错误,但坦率地说,更大的问题是我不知道如何解决整个命名空间问题.我只是在寻找一种方便的方法来从XML文档中反序列化单个节点,但这似乎需要手动注册/管理命名空间,并以某种方式将它们转发XmlReader到XmlSerializer.
有人XmlReader可以通过指出我的代码中的错误,或通过显示替代方法来演示如何从使用的XML文档中反序列化单个节点吗?
我有一个 pojo,我正在使用 com.fasterxml.jackson.dataformat.xml.XmlMapper 序列化它。
我有一个用多个字符串值定义的 Java 类。
@JacksonXmlRootElement(namespace = "http://www.firstnamespace.com", localName = "Student")
public class Student {
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "ID")
public final String id;
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "Name")
public final String name;
@JacksonXmlProperty(namespace = "http://www.firstnamespace.com",localName = "Address")
public Address address;
}
Run Code Online (Sandbox Code Playgroud)
地址定义如下,地址的元素位于不同的命名空间中
public class Address {
@JacksonXmlProperty(namespace = "http://www.secondnamespace.com",localName = "StreetNumber")
public final String streetNumber;
@JacksonXmlProperty(namespace = "http://www.secondnamespace.com",localName = "StreetName")
public final String steetName;
}
Run Code Online (Sandbox Code Playgroud)
当我用 Jackson 序列化 Student 时,我最终得到了地址对象的一堆重复的命名空间。
<Student xmlns="http://www.firstnamespace.com">
<ID>1234</ID>
<Name>Ken</Name>
<Address>
<wstxns1:StreetNumber xmlns:wstnxs1="http://www.secondnamespace.com">Ken</wstxns1:StreetNumber> …Run Code Online (Sandbox Code Playgroud) java xml xml-serialization xml-namespaces jackson-dataformat-xml