在 Net Core 中为 XML 添加不同的 Namespace 前缀和属性

问题描述 投票:0回答:2

我想将多个名称空间前缀和属性添加到 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");
    }
}

以上内容部分适用于前缀。

我知道我们有类似的问题,但没有一个对我有用。感谢您的帮助,谢谢。

c# xml xsd xml-parsing
2个回答
0
投票

以下 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 来完成。


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>
© www.soinside.com 2019 - 2024. All rights reserved.