正如代码所言,我无法在 Go 中使用冒号解组 xml 元素。
https://play.golang.org/p/zMm5IQSfS01
package main
import (
"fmt"
"encoding/xml"
)
type Obj struct {
XMLName xml.Name `xml:"book"`
AbcName string `xml:"abc:name"`
}
func main() {
a := []byte(`<book><abc:name>text</abc:name></book>`)
obj := &Obj{}
if err := xml.Unmarshal(a, obj); err != nil {
panic(err)
}
fmt.Printf("%#v\n", obj)
}
Run Code Online (Sandbox Code Playgroud)
代码输出:
&main.Obj{XMLName:xml.Name{Space:"", Local:"book"}, AbcName:""}
Run Code Online (Sandbox Code Playgroud)
是否可以在 Golang 中使用冒号解组 xml 元素?如果是,怎么办?
我有以下XML:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAgence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.artos.co.il/">
<Agence>
<CodeAval>20008</CodeAval>
<CodeSource>ArtPO</CodeSource>
<LogicielSource>NTLIS</LogicielSource>
</Agence>
</ArrayOfAgence>
Run Code Online (Sandbox Code Playgroud)
我想获得CodeAval值,所以我试过:
ArrayOfAgence/Agence/CodeAval
Run Code Online (Sandbox Code Playgroud)
它显然没有用,因为这个XML有一个命名空间,所以,我该如何处理呢?
谢谢,
我有一个xml文档,其名称空间看起来与此类似,我只是为了提问而简化它.
<MyNameSpace xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace">
<IDmain>ins</IDmain>
<Table_1 class="entity">
<Address>Oak Park Drive</BillingProviderAddress>
<City>Lake Elizabeth</BillingProviderCity>
<Name>Corporation</BillingProviderOrgName>
<InvoiceLine class ="entity">
<DateService>1234</DateService>
</InvoiceLine>
<Table_1>
</MyNameSpace>
Run Code Online (Sandbox Code Playgroud)
然后我在这里创建了一个XSLT.我理解它的丑陋,我不是XSLT专家,但这是"只是解决问题"的时刻之一.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vPrefix">
<xsl:value-of select="MyNameSpace/Table_1/Address"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/City"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="MyNameSpace/Table_1/Name"/>
<xsl:text>|</xsl:text>
</xsl:variable>
<xsl:for-each select="MyNameSpace/Table_1/InvoiceLine">
<xsl:value-of select="$vPrefix"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="DateService"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
现在,XSLT完全符合我的要求,问题是,我的测试数据在XML文档的顶部包含了这个时髦的命名空间.
的xmlns = "http://schemas.microsoft.com/dynamics/2006/02/documents/MyNameSpace"
有两件事,我正在使用XMLPAD,当我运行脚本时,它实际上就可以使用名称空间.
不幸的是,该解决方案并不理想,因为当我尝试在我需要的另一个XSLT工具中运行它时(在运行时)它无法正常运行.
我知道命名空间正在抛弃我正在使用的XSLT,因为当我从XML中删除它时,它在测试中运行良好.然而,这种解决方案并不合理,因为整个过程实际上是自动化的.所以我需要一个名称空间问题的解决方案.
有什么想法吗?
我想在xml中使用这种格式:
<ns2: test xmlns="url" xmlns:ns2="url2" xmlns:ns3="url3">
....
</ns2: test>
Run Code Online (Sandbox Code Playgroud)
我使用以下代码:
Namespace ns= Namespace.getNamespace("url");
Namespace ns2 = Namespace.getNamespace("ns2", "url2");
Namespace ns3= Namespace.getNamespace("ns3", "url3");
SAXBuilder vDocBuilder = new SAXBuilder();
Document vDocument = vDocBuilder.build(File);
System.out.println("Root element " + vDocument.getRootElement().getName());
org.jdom.Element test = new org.jdom.Element("test", ns);
vDocument.setRootElement(test);
vNewRootElement.addNamespaceDeclaration(ns2);
vNewRootElement.addNamespaceDeclaration(ns3);
Run Code Online (Sandbox Code Playgroud)
如果我设置名称空间:
vNewRootElement.setNamespace(ns3);
Run Code Online (Sandbox Code Playgroud)
然后我得到了
<ns2: test xmlns:ns2="url2" xmlns:ns3="url3"> ... </ns2: test>
without the default namespace xmlns="url".
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么它不起作用,有没有办法解决这个问题?
谢谢,哈纳
我想补充一下
xsi:noNamespaceSchemaLocation="FullModeDataset.xsd"
和
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
作为我的根节点"ApplicationData"的属性,所以根节点将如下所示..
<ApplicationData
xsi:noNamespaceSchemaLocation="FullModeDataset.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
Run Code Online (Sandbox Code Playgroud)
我正在从一个字符串创建xml,使用此代码输出一个正确的xml字符串.
var doc = new XmlDocument();
doc.LoadXml(myInputXmlString);
var ms = new MemoryStream();
var tx = XmlWriter.Create(ms,
new XmlWriterSettings
{
OmitXmlDeclaration = false,
ConformanceLevel = ConformanceLevel.Document,
Encoding = UTF8Encoding.UTF8
});
doc.Save(tx);
//I TRIED THE COMMENTED CODE BELOW BUT WITH NO SUCCESS
//XmlAttribute newAttr = doc.CreateAttribute("xsi:noNamespaceSchemaLocation");
//newAttr.Value = "FullModeDataset.xsd";
//XmlElement applicationNode = doc.DocumentElement["AppicationData"];
//applicationNode.Attributes.Append(newAttr);
//doc.Save(tx);
var xmlString = UTF8Encoding.UTF8.GetString(ms.ToArray());
Run Code Online (Sandbox Code Playgroud)
如何将这些属性添加到我的xml字符串?
我正在尝试通过使用以下代码中的C#XmlDocument类来编写一个SOAP请求来ebay FindingAPI Web服务:
XmlDocument doc = new XmlDocument();
XmlElement root = (XmlElement)doc.AppendChild(doc.CreateElement("soap", "Envelope", "http://www.w3.org/2003/05/soap-envelope"));
root.SetAttribute("xmlns", "http://www.ebay.com/marketplace/search/v1/services");
XmlElement header = (XmlElement)root.AppendChild(doc.CreateElement("soap", "Header", "http://www.w3.org/2003/05/soap-envelope"));
XmlElement body = (XmlElement)root.AppendChild(doc.CreateElement("soap", "Body", "http://www.w3.org/2003/05/soap-envelope"));
XmlElement request = (XmlElement)body.AppendChild(doc.CreateElement("findItemsByKeywordsRequest"));
XmlElement param = (XmlElement)request.AppendChild(doc.CreateElement("keywords"));
param.InnerText = "harry potter phoenix";
Run Code Online (Sandbox Code Playgroud)
并且,上面代码的XML输出是:
<soap:Envelope xmlns="http://www.ebay.com/marketplace/search/v1/services" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header />
<soap:Body>
<findItemsByKeywordsRequest xmlns="">
<keywords>harry potter phoenix</keywords>
</findItemsByKeywordsRequest>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
但是,由于findItemsByKeywordsRequest元素中的额外xmlns =""属性,服务器无法识别此XML.所需的XML输出应如下所示:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns="http://www.ebay.com/marketplace/search/v1/services">
<soap:Header/>
<soap:Body>
<findItemsByKeywordsRequest>
<keywords>harry potter phoenix</keywords>
</findItemsByKeywordsRequest>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
有谁知道我的代码有什么问题,请给我一些提示.谢谢!
看着RSS,像Craigslist的(http://chambana.craigslist.org/cta/index.rss)这样的东西会给两个节点都命名空间,而没有命名空间。
就像是:
<item rdf:about="http://dallas.craigslist.org/sdf/cto/4206532641.html">
<title>
<![CDATA[ 1965 Pontiac Tempest GTO tribute ]]>
</title>
...tl;dr...
<dc:title>
<![CDATA[ 1965 Pontiac Tempest GTO tribute ]]>
</dc:title>
</item>
Run Code Online (Sandbox Code Playgroud)
就像是:
(item \ "title").text
Run Code Online (Sandbox Code Playgroud)
两次给出标题。如何访问命名空间节点?
我想在样式表本身的前缀中更改输出中的前缀.
XSLT文件:
<stylesheet version="1.0" xmlns:a="nsA">
<template match="/">
<a:out/>
</template>
</stylesheet>
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
<a:out xmlns:a="nsA" />
Run Code Online (Sandbox Code Playgroud)
我想要的是:
<b:out xmlns:b="nsA" />
Run Code Online (Sandbox Code Playgroud)
请注意,我只想更改前缀,而不是命名空间.元命名空间别名将仅转换命名空间,保留前缀不变.
如果可以完全删除前缀,则可以获得奖励积分:
<out xmlns="nsA" />
Run Code Online (Sandbox Code Playgroud)
请注意,XSLT元素没有前缀,输出元素是前缀.它必须保持这样.我知道问题可以通过前缀XSLT和取消前缀输出元素来解决,但它不是一个选项.要输出的元素必须具有样式表中提供的前缀,只有在输出中才能更改它们.
为什么会出现此错误:
错误:未声明前缀“ xsi”的命名空间。
这是我的Java代码:
package com.emp.ma.jbl.nsnhlrspmlpl.nsnhlrspmlpl.internal.action;
import com.emp.ma.util.xml.XMLDocument;
import com.emp.ma.util.xml.XMLDocumentBuilder;
public class yay {
public static void main(String[] args) {
XMLDocument xmldoc = XMLDocumentBuilder.newDocument().addRoot("spml:modifyRequest");
xmldoc.gotoRoot().addTag("modification").addText("");
xmldoc.gotoChild("modification").addTag("valueObject").addText("");
xmldoc.gotoChild("valueObject").addAttribute("xsi:type","halo");
System.out.println(xmldoc);
}
}
Run Code Online (Sandbox Code Playgroud)
直到我尝试引发转换器异常,同时将XML文件转换为HTML进行实验时,这段代码才能正常运行。我需要创建一个格式为xml的文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<spml:modifyRequest>
<modification>
<valueObject xsi:type="halo">
</valueObject>
</modification>
</spml:modifyRequest>
Run Code Online (Sandbox Code Playgroud)
我已经从代码中删除了转换器部分,但是在eclipse中却遇到了这个错误:
ERROR: 'Namespace for prefix 'xsi' has not been declared.'
Exception in thread "main" com.emp.ma.util.xml.XMLDocumentException: java.lang.RuntimeException: Namespace for prefix 'xsi' has not been declared.
at com.emp.ma.util.xml.XMLDocumentImpl.toResult(XMLDocumentImpl.java:1244)
at com.emp.ma.util.xml.XMLDocumentImpl.toStream(XMLDocumentImpl.java:1314)
at com.emp.ma.util.xml.XMLDocumentImpl.toString(XMLDocumentImpl.java:1336)
at com.emp.ma.util.xml.XMLDocumentImpl.toString(XMLDocumentImpl.java:1325)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 我想编写将XML exists()函数与命名空间和IF-ELSE构造结合使用的T-SQL代码。
从这个线程中,我知道这WITH XMLNAMESPACES是用来使用名称空间的。我也知道该exist()函数用于确定XML变量中是否存在节点。
到目前为止,我的用法exist()如下:
IF ((@MyXML.exist('someNode')) = 0)
BEGIN
-- Do Something
END
ELSE
BEGIN
-- Do Something else
END
Run Code Online (Sandbox Code Playgroud)
但是,如果需要使用名称空间,我不知道如何结合使用。我尝试如下,但收到错误。
;WITH XMLNAMESPACES('http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message' AS ns)
IF ((@MyXML.exist('ns:someNode')) = 0)
BEGIN
-- Do Something
END
ELSE
BEGIN
-- Do Something else
END
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
关键字“ WITH”附近的语法不正确。
因此,我的问题是:如何将T-SQL If-Else构造与XML名称空间和XML exist()函数结合使用?
xml-namespaces ×10
xml ×8
xslt ×3
c# ×2
java ×2
exists ×1
go ×1
jdom ×1
prefix ×1
scala ×1
sql-server ×1
t-sql ×1
xmldocument ×1
xpath ×1