我想将多个名称空间前缀和属性添加到 Net6 Core API 中的现有 XML。 我有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://test.co.uk" xmlns:temp="http://tes007.co.uk" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<Title>Hello</Title>
</Header>
<PutData>
<Credentials>
<Username>Test</Username>
<Password>1234</Password>
</Credentials>
<Payload>
<Filename>test.xml</Filename>
<FileType>Xml</FileType>
</Payload>
<message>
<title>Title1</title>
<body></body>
</message>
</PutData>
</note>
我想要实现的是:
<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://test.co.uk" xmlns:temp="http://tes007.co.uk" xmlns:xsi="http://test0010.com.br">
<xsi:Header>
<Title>Hello</Title>
</xsi:Header>
<temp:PutData>
<Credentials>
<Username>Test</Username>
<Password>1234</Password>
</Credentials>
<Payload>
<Filename>test.xml</Filename>
<FileType>Xml</FileType>
</Payload>
<message Type="TEST007">
<title>Title1</title>
<body></body>
</message>
</temp:PutData>
</note>
我试过类似的东西:
XmlDocument doc = XmlDocument.LoadXml(xml);
var xPath = "//*" //all nodes
foreach(XmlElement node in doc.SelectNodes(xPath))
{
if(node.Name == "Header")
{
node.Prefix = "xsi";
node.RemoveAttribute("xmlns");
}
if(node.Name == "PutData")
{
node.Prefix = "temp";
node.RemoveAttribute("xmlns");
}
}
以上内容部分适用于前缀。
我知道我们有类似的问题,但没有一个对我有用。感谢您的帮助,谢谢。
以下 XSLT 3.0 转换更改了 PutData 元素的名称空间并保持其他一切不变:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="*:PutData">
<xsl:element name="temp:PutData" namespace="http://tes007.co.uk">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:transform>
如果您更喜欢使用 Microsoft 提供的工具,也可以使用 XSLT 1.0 来完成。
正如评论者指出的那样,.NET 中的
System.Xml
API 不能做你想做的事,你必须使用System.Xml.Linq
API(XDocument
,XElement
等):
var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <note xmlns=\"http://test.co.uk\" xmlns:temp=\"http://tes007.co.uk\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"> <Header> <Title>Hello</Title> </Header> <PutData> <Credentials> <Username>Test</Username> <Password>1234</Password> </Credentials> <Payload> <Filename>test.xml</Filename> <FileType>Xml</FileType> </Payload> <message> <title>Title1</title> <body></body> </message> </PutData> </note>";
var xdoc = XDocument.Parse(xml);
var xdocAttributes = xdoc.Root.Attributes();
var xsiNs = xdocAttributes.First(n => n.Name.LocalName == "xsi");
var tempNs = xdocAttributes.First(n => n.Name.LocalName == "temp");
xsiNs.Value = "http://test0010.com.br";
var header = xdoc.Descendants().First(d => d.Name.LocalName == "Header");
header.Name = XName.Get("Header", xsiNs.Value);
var putData = xdoc.Descendants().First(d => d.Name.LocalName == "PutData");
putData.Name = XName.Get("PutData", tempNs.Value);
var message = xdoc.Descendants().First(m => m.Name.LocalName == "message");
message.Add(new XAttribute("Type", "TEST007"));
使用
xdoc.ToString()
会给你:
<note xmlns="http://test.co.uk" xmlns:temp="http://tes007.co.uk" xmlns:xsi="http://test0010.com.br">
<xsi:Header>
<Title>Hello</Title>
</xsi:Header>
<temp:PutData>
<Credentials>
<Username>Test</Username>
<Password>1234</Password>
</Credentials>
<Payload>
<Filename>test.xml</Filename>
<FileType>Xml</FileType>
</Payload>
<message Type="TEST007">
<title>Title1</title>
<body></body>
</message>
</temp:PutData>
</note>