根据该标准,“XML名称空间提供了一种简单的方法,用于通过将它们与URI引用标识的名称空间相关联来限定可扩展标记语言文档中使用的元素和属性名称。”
使用 Inno Setup 更改配置标签中包含命名空间的 web.config
我想在使用 Inno Setup 创建的安装包的 web.config 文件中为节点设置新属性。 为了设置此属性,我使用过程 SaveAttributeValueToXML。 我的 web.conf...
我的 android studio res 布局 xml 文件名显示重复
Android studio xml文件名问题 我的 android studio res 布局 xml 文件名显示重复。我的可绘制文件名也显示了两次。例如:main_activity.xmlmain_activity.xml。我...
如何使用 XmlSlurper (Apache Groovy) 将命名空间添加到 XML 属性?
我正在迭代扁平 XML 的子元素,并为空元素添加特定属性。 导入 groovy.xml.XmlUtil 导入 groovy.xml.MarkupBuilder 导入 groovy.xml。
在 Java 中使用 xPath 解析具有多个命名空间的 XML
我正在尝试解析一个具有两个 xmlns 命名空间的 XML 文档,并且我的所有 xPath 查询都返回 null。 我想解析类别节点的值并创建一个数组,但因为文档...
我有问题,如果我尝试解析文件,我会收到连接拒绝错误。 这是因为我运行代码的机器上没有互联网连接,并且我不可能......
使用bash我试图从下面的soap响应中提取id和name作为键值对,并希望将此对存储在csv文件中。 下面的 xmllint 命令返回不需要的值,因为我无法...
大家好,我正在尝试在 wso2 MI 中创建有效负载,并且已经编写了代码,因此对于下面提到的代码: 大家好,我正在尝试在 wso2 MI 中创建有效负载,并且已经编写了代码,因此对于下面提到的代码: <payloadFactory media-type="xml"> <format> <soapenv:Envelope xmlns:chan="http://www.tibco.com/ChangeSubOfferingAPI/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <chan:ChangeSubOfferingRqsAPI> <Header> <Username>$1</Username> </Header> <Body> <SerialNo>$2</SerialNo> </Body> </chan:ChangeSubOfferingRqsAPI> </soapenv:Body> </soapenv:Envelope> </format> <args> <arg evaluator="xml" expression="$ctx:userName"/> <arg evaluator="xml" expression="$ctx:password"/> </args> </payloadFactory> 我得到这个有效负载: <?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:chan="http://www.tibco.com/ChangeSubOfferingAPI/"> <soapenv:Body> <chan:ChangeSubOfferingRqsAPI> <Header xmlns="http://ws.apache.org/ns/synapse"> <Username>abcd</Username> </Header> <Body xmlns="http://ws.apache.org/ns/synapse"> <SerialNo>100000000</SerialNo> </Body> </chan:ChangeSubOfferingRqsAPI> </soapenv:Body> </soapenv:Envelope> 任何人都可以帮助我理解如何更改有效负载工厂以便从 Header 和 Body 标记中删除 xmlns 的指南吗?就像而不是“”,我希望它是“”,仅适用于 Body 标签。任何支持都会很棒。 谢谢 您需要向您的有效负载添加一个空命名空间,例如 xmlns="" <payloadFactory media-type="xml"> <format> <soapenv:Envelope xmlns="" xmlns:chan="http://www.tibco.com/ChangeSubOfferingAPI/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <chan:ChangeSubOfferingRqsAPI> <Header> <Username>$1</Username> </Header> <Body> <SerialNo>$2</SerialNo> </Body> </chan:ChangeSubOfferingRqsAPI> </soapenv:Body> </soapenv:Envelope> </format> <args> <arg evaluator="xml" expression="$ctx:userName"/> <arg evaluator="xml" expression="$ctx:password"/> </args> </payloadFactory>
这是一个 XSD: 这是一个 XSD: <?xml version="1.0"?> <xsd:schema elementFormDefault='unqualified' attributeFormDefault='unqualified' xmlns:xsd='http://www.w3.org/2001/XMLSchema' > <xsd:simpleType name='TheSimpleType'> <xsd:restriction base='xsd:string' /> </xsd:simpleType> </xsd:schema> 这是第二个 XSD,其中包括上面的 XSD: <?xml version="1.0" encoding="UTF-8" ?> <xsd:schema elementFormDefault='unqualified' attributeFormDefault='unqualified' xmlns:xsd='http://www.w3.org/2001/XMLSchema' targetNamespace='a' xmlns='a' > <xsd:include schemaLocation='Include.xsd' /> <xsd:element name = "TheElement" > <xsd:complexType> <xsd:attribute name="Code" type="TheSimpleType" use="required"/> </xsd:complexType> </xsd:element> </xsd:schema> 我需要将(第二个)XSD 读入 C# 中并且: 检查它是否是有效的 XSD,并且 根据它验证文件。 这里有一些需要在架构中阅读的 C# 代码: XmlSchemaSet schemaSet = new XmlSchemaSet(); foreach (string sd in Schemas) { using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open))) { schemaSet.Add(XmlSchema.Read(r, null)); } } schemaSet.CompilationSettings = new XmlSchemaCompilationSettings(); schemaSet.Compile(); .Compile() 失败,因为“类型 'a:TheSimpleType' 未声明,或者不是简单类型。” 但是,如果满足以下任一条件,它就会起作用: 名称空间已从架构中删除,或者 命名空间已添加到包含中。 问题是:如何让 C# 在不编辑架构的情况下接受它? 我怀疑问题在于,虽然我已将两个模式放入 XmlSchemaSet 中,但我仍然需要告诉 C# 其中一个模式包含在另一个模式中,即它本身尚未解决。事实上,如果我只告诉 XmlSchemaSet 有关主 XSD(而不是包含)(没有(或有)命名空间),那么“类型 'TheSimpleType' 未声明,或者不是简单类型。” 因此,这似乎是一个关于解决的问题,包括:如何?! 问题在于打开架构以供在线阅读的方式: XmlReader.Create(new FileStream(sd, FileMode.Open) 我必须编写自己的XmlResolver,然后才能看到包含文件的路径是如何解析的:它来自可执行文件的目录,而不是来自父模式的目录。问题在于父架构未获取其 BaseURI 集。以下是打开架构的方法: XmlReader.Create(new FileStream(pathname, FileMode.Open, FileAccess.Read),null, pathname) 您可以使用 XmlSchema.Includes 将它们链接在一起。然后,您只需将主模式添加到模式集中即可: var includeSchema = XmlSchema.Read(XmlReader.Create(...), null); var mainSchema = XmlSchema.Read(XmlReader.Create(...), null); var include = new XmlSchemaInclude(); include.Schema = includeSchema; mainSchema.Includes.Add(include); var schemaSet = new XmlSchemaSet(); schemaSet.Add(mainSchema); schemaSet.Compile(); XmlSchemaSet 的默认行为是不尝试解析任何 XSD 包含的架构。为此,必须初始化 XmlResolver 属性。 XmlSchemaSet schemas = new XmlSchemaSet { XmlResolver = new XmlUrlResolver() }; 此外,您必须按照 @Richard Barraclough 的回答为 XmlReader 设置 baseUri。 试试这个:D public static XmlSchema LoadSchema(string pathname) { XmlSchema s = null; XmlValidationHandler h = new XmlValidationHandler(); using (XmlReader r = XmlReader.Create(new FileStream(pathname, FileMode.Open))) { s = XmlSchema.Read(r, new ValidationEventHandler(h.HandleValidationEvent)); } if (h.Errors.Count > 0) { throw new Exception(string.Format("There were {1} errors reading the XSD at {0}. The first is: {2}.", pathname, h.Errors.Count, h.Errors[0])); } return s; } public static XmlSchema LoadSchemaAndResolveIncludes(string pathname) { FileInfo f = new FileInfo(pathname); XmlSchema s = LoadSchema(f.FullName); foreach(XmlSchemaInclude i in s.Includes) { XmlSchema si = LoadSchema(f.Directory.FullName + @"\" + i.SchemaLocation); si.TargetNamespace = s.TargetNamespace; i.Schema = si; } return s; } public static List<ValidationEventArgs> Validate(string pathnameDocument, string pathnameSchema) { XmlSchema s = LoadSchemaAndResolveIncludes(pathnameSchema); XmlValidationHandler h = new XmlValidationHandler(); XmlDocument x = new XmlDocument(); x.Load(pathnameDocument); x.Schemas.Add(s); s.Compile(new ValidationEventHandler(h.HandleValidationEvent)); x.Validate(new ValidationEventHandler(h.HandleValidationEvent)); return h.Errors; } 特别注意si.TargetNamespace = s.TargetNamespace;。 显然,这假设包含被指定为相对于它们所包含到的模式的文件路径。 这是我编写的用于处理 xsd 验证的方法。希望这对某人有所帮助。 /// <summary> /// Ensure all xsd imported xsd documented are in same folder as master xsd /// </summary> public XsdXmlValidatorResult Validate(string xmlPath, string xsdPath, string xsdNameSpace) { var result = new XsdXmlValidatorResult(); var readerSettings = new XmlReaderSettings {ValidationType = ValidationType.Schema}; readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; readerSettings.Schemas.Add(null, xsdPath); readerSettings.ValidationEventHandler += (sender, args) => { switch (args.Severity) { case XmlSeverityType.Warning: result.Warnings.Add(args.Message); break; case XmlSeverityType.Error: result.IsValid = false; result.Warnings.Add(args.Message); break; } }; var reader = XmlReader.Create(xmlPath, readerSettings); while (reader.Read()) { } return result; } 使用.net6,代码如下 - XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.XmlResolver = new XmlUrlResolver(); // Need this for resolving include and import settings.ValidationType = ValidationType.Schema; // This might not be needed, I am using same settings to validate the input xml settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; settings.Schemas.Add(null, "yourpath\\yourxsd.xsd"); settings.Schemas.Compile(); string xmlFilePath = "yourpath\\your.xml"; ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); // Create an XmlReader for the XML file using (XmlReader reader = XmlReader.Create(xmlFilePath, settings)) { } 想要强调的是,对于 net6,我们必须设置 settings.Schemas.XmlResolver = new XmlUrlResolver() 而不是 settings.XmlResolver = new XmlUrlResolver()
以下 XML 片段中的两个狗元素是否相同? 片段1: 狗是第一个被驯化的物种 以下 XML 片段中的两个狗元素是否相同? 片段1: 狗是第一个被驯化的物种 片段2: 狗是第一个被驯化的物种 我得到了两个不同的答案。告诉我正确的一个。对我来说可能是相同。
XSLT:从复制的节点丢失 xmlns 属性,该属性以前由祖先定义?
使用 XSLT 复制节点和属性时,如果这些属性先前已由祖先节点定义,我将丢失 xmlns 属性值。 后代的属性定义是
我正在尝试针对 XSD 验证 XML。 XML 在根元素中包含命名空间声明: xmlns="http://www.sample.com/itemfile" 目前,当我正在验证时,我...
就我而言,我有以下代码: 从 lxml 导入 etree as et 从 lxml.builder 导入 ElementMaker WSS_SCHEMA = "http://schemas.xmlsoap.org/ws/2002/12/secext" ACTOR_SCHEMA = "...
我想删除包含命名空间的特定元素的属性。 在以下元素中: 我想删除 xsi:nil...
我需要一些关于 C# (.NET) 中的 System.XML 的帮助。 我在 .xml 文件中的某处有此文本: 9.118782 50.178153 我需要一些关于 C# (.NET) 中 System.XML 的帮助。 我在 .xml 文件中的某处有此文本: <Location> <Longitude>9.118782</Longitude> <Latitude>50.178153</Latitude> <gml:pos>104049 489104</gml:pos> </Location> 由于第三个字段名称中有一个冒号,我不能将其用作变量。 因此,我的反序列化类(通过 XmlSerializer.Deserialize)如下所示: public class Location { public decimal Longitude { get; set; } // this works! public decimal Latitude { get; set; } // this works! [XmlAttribute("gml:pos")] public string GmlPos { get; set; } } 抛出异常。我对 XML 不是很熟悉,但由于异常,我发现冒号代表 XML 命名空间,所以我也尝试了这些不同的选项(当然是同时尝试): [XmlAttribute("pos", Namespace = "gml")] public string GmlPos { get; set; } [XmlAttribute("pos", Namespace = "gml/")] public string GmlPos { get; set; } [XmlAttribute(Namespace = "gml")] public string pos { get; set; } [XmlAttribute(Namespace = "gml/")] public string pos { get; set; } 没有异常,但该字段仍然为空。我还用 XmlElement 而不是 XmlAttribute 尝试了每个选项。 不幸的是,这不容易用谷歌搜索,因为短语“命名空间”总是导致 System.XML ... 请不要建议更改 .xml 文件;) 感谢您的每一次帮助, 蒂姆 gml 不是这里的命名空间——它是一个命名空间别名。一旦你弄清楚了 actual 命名空间是什么(寻找 xmlns:gml="..."),你就可以按照你的第一个例子在 XmlAttribute 中指定它。我怀疑命名空间是http://www.opengis.net/gml/3.2,在这种情况下你会: [XmlAttribute("pos", Namespace="http://www.opengis.net/gml/3.2")] public string GmlPos { get; set; }
我正在编写一个 Delphi (10.4) 程序来将数据库导出为 XML。目的是将 .xml 文件直接打开到 Excel 中。我正在使用工作 .xml 作为需要导出内容的基础。当...
在一个 .NET MAUI 项目中,我创建了一个类,我想在 XAML 文件中使用它,所以我添加了一个 xmlns,但是这个命名空间无法访问该类。 我正在尝试通过此命名空间访问该类: &l...
我正在尝试使用 matlab 读取网页(这是字典网页)并使用 extractHTMLText 将 html 数据转换为文本以获取一些信息,但 MATLAB 给出了此错误: “错误...
要编辑的 XML - 要编辑的 XML - <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <broker xmlns="http://activemq.apache.org/schema"> <jaas-security domain="activemq"/> <server configuration="file:/Users/gugu/Docs/artemis/var/lib/broker/etc//broker.xml"/> <web path="web" rootRedirectLocation="console"> <binding uri="https://localhost:8161"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"/> </binding> </web> </broker> 在上面的 XML 中,我想添加以下属性uri="https://localhost:8161". keyStorePath="$path/server-keystore.jks" keyStorePassword="password" 添加这些后,需要将http更改为https,还可能需要更改端口。 结果- <binding uri="https://localhost:8443" keyStorePath="$path/server-keystore.jks" keyStorePassword="securepass"> 上面用于keystone.jks的路径和密码应该来自两个不同的变量。 有人可以帮助我如何使用 XMLstarlet 或 sed 命令就地编辑它吗? 我试过的- 要添加属性,(首先我尝试不使用变量) xmlstarlet edit --inplace \ --insert "/broker/web/binding[not(@keyStorePath)]" --type attr -n keyStorePath --value ".ssl/server-keystore.jks" \ bootstrap.xml 文件没有变化 您的 XML 文件使用 namespaces (xmlns=)。这将添加两个属性并更新一个属性: xmlstarlet edit \ -N x='http://activemq.apache.org/schema' \ --insert '//x:broker/x:web/x:binding' --type attr -n 'keyStorePath' --value '$path/server-keystore.jks' \ --insert '//x:broker/x:web/x:binding' --type attr -n 'keyStorePassword' --value 'password' \ --update '//x:broker/x:web/x:binding/@uri' --value 'https://localhost:8443' \ file.xml 输出: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <broker xmlns="http://activemq.apache.org/schema"> <jaas-security domain="activemq"/> <server configuration="file:/Users/gugu/Docs/artemis/var/lib/broker/etc//broker.xml"/> <web path="web" rootRedirectLocation="console"> <binding uri="https://localhost:8443" keyStorePath="$path/server-keystore.jks" keyStorePassword="password"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"/> </binding> </web> </broker> 关于语法的信息:xmlstarlet edit
我有一个 XML 文件,我只需要更改其中的 2 个属性: 我有一个 XML 文件,我只需要更改其中的 2 个属性: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> <Document> <name>lines.kmz</name> <Style id="LineStyle00"> <LabelStyle> <color>00000000</color> <scale>0</scale> </LabelStyle> .............. 我需要更改的是colo标签内的scale和labelstyle。 这是我试过的: import xml.etree.ElementTree as ET def update_label_style(kml_path, new_color, new_scale): # parse the KML file tree = ET.parse(kml_path) root = tree.getroot() # define the namespace for KML elements ns = {'kml': 'http://www.opengis.net/kml/2.2'} # find all LabelStyle elements and update their color and scale values for label_style in root.findall('.//kml:LabelStyle', ns): label_style.find('kml:color', ns).text = new_color label_style.find('kml:scale', ns).text = new_scale # write the updated KML file back to disk tree.write(kml_path, encoding='utf-8', xml_declaration=True) print("Changed the label style") 编辑完成后,XML 文件如下: <?xml version='1.0' encoding='utf-8'?> <ns0:kml xmlns:ns0="http://www.opengis.net/kml/2.2"> <ns0:Document> <ns0:name>lines.kmz</ns0:name> <ns0:Style id="LineStyle00"> <ns0:LabelStyle> 问题是它在每个标签之前添加了ns0,它还删除了整行 <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
我需要通过以下方式创建 SOAP 消息(注意示例:SomeCommand): 我需要通过以下方式创建 SOAP 消息(注意 example:SomeCommand): <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <example:SomeCommand> <Field1>field1</Field1> <Field2>field2</Field2> </example:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 我有以下代码: public String marshal() throws Exception { SomeCommand someCommand = new SomeCommand("field1", "field2"); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); Document document = documentBuilderFactory.newDocumentBuilder().newDocument(); Marshaller marshaller = JAXBContext.newInstance(SomeCommand.class).createMarshaller(); marshaller.marshal(someCommand, document); SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); soapMessage.getSOAPPart().getEnvelope().addNamespaceDeclaration( "example", "example.com"); soapMessage.getSOAPBody().addDocument(document); OutputStream outputStream = new ByteArrayOutputStream(); soapMessage.writeTo(outputStream); return outputStream.toString(); } SomeCommand在哪里: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") @XmlRootElement(namespace = "example.com", name = "SomeCommand") public class SomeCommand { @XmlElement(name = "Field1", required = true) private String field1; @XmlElement(name = "Field2", required = true) private String field2; public SomeCommand(){} public SomeCommand(String field1, String field2){ this.field1 = field1; this.field2 = field2; } } 但结果是: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="example.com"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns2:SomeCommand xmlns:ns2="example.com"> <Field1>field1</Field1> <Field2>field2</Field2> </ns2:SomeCommand> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 有没有什么方法可以在 SOAP 消息的正文中附加一个文档,重用现有的命名空间 (example) 而不是重新定义它们? 提前致谢。