如何使用c#从xml元素中删除xmlns标记

时间:2017-02-15 09:20:36

标签: c# xml xsd

我想从除root标签之外的所有xml元素中删除此xmlns =“http://www.AB.com/BC/QualityDeviationCase/1_0”。使用C#的xml元素。我已经编写了下面的代码来获取xml表单。但无法从xml元素中删除xmlns标记。

<?xml version="1.0" encoding="utf-16"?>
<QualityDeviationCaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <CaseID xmlns="http://www.AB.com/BC/QualityDeviationCase/1_0">2</CaseID>
 <Description xmlns="http://www.AB.com/BC/QualityDeviationCase/1_0">Air filter is not present</Description>
 <StartDate xmlns="http://www.AB.com/BC/QualityDeviationCase/1_0">0001-01-01T00:00:00</StartDate>
 <LastUpdated xmlns="http://www.AB.com/BC/QualityDeviationCase/1_0">0001-01-01T00:00:00</LastUpdated>
</QualityDeviationCaseType>

删除xmlns =“http://www.AB.com/BC/QualityDeviationCase/1_0”此标记后,我的结果应如下所示返回 -

<?xml version="1.0" encoding="utf-16"?>
<QualityDeviationCaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <CaseID>2</CaseID>
 <Description>Air filter is not present</Description>
 <StartDate>0001-01-01T00:00:00</StartDate>
 <LastUpdated>0001-01-01T00:00:00</LastUpdated>
</QualityDeviationCaseType>

我的C#代码,我从我的XSD文件中获取xml结果。

connection.Open();
adapter = new SqlDataAdapter(sql, connection);
adapter.Fill(dt);
myTestTable = dt.Clone();
DataRow[] orderRows = dt.Select();

XmlDocument xmlDoc = new XmlDocument();
QualityDeviationCaseType oQualityDeviationCaseType = new QualityDeviationCaseType();

foreach (DataRow row in orderRows)
{
    oQualityDeviationCaseType = new QualityDeviationCaseType();
    oQualityDeviationCaseType.CaseID = row[0].ToString();
    oQualityDeviationCaseType.Description = row[3].ToString();
}

using (StringWriter stringwriter = new System.IO.StringWriter())
{
    XmlSerializer ser = new XmlSerializer(typeof(QualityDeviationCaseType));
    ser.Serialize(stringwriter, oQualityDeviationCaseType);
    sampleChannel.Publish(stringwriter.ToString());

    //This line of code sending my xml file to IBM WMQ.
}

根据我上面的代码,我的结果是每个lement的xml标签。我想使用c#。

从元素标记中删除

2 个答案:

答案 0 :(得分:0)

xmlns属性在XML中具有重要的语义:它将所有元素放在默认命名空间http://www.AB.com/BC/QualityDeviationCase/1_0中。

我并不熟悉C#,但是:删除它意味着在语义层面而不是句法层面进行推理。

具体而言,应该通过删除正在导出的XML文档中的所有元素的名称空间来完成,或者首先不将它们放在任何名称空间中。如果C#库已经完成,它应该提供一种方法。

答案 1 :(得分:0)

你试过Regex吗?

 using System.Text.RegularExpressions;
 ...
    string pattern = @"xmlns=""[a-zA-Z0-9:\/._]{1,}""";
    using (StringWriter stringwriter = new System.IO.StringWriter())
    {
        XmlSerializer ser = new XmlSerializer(typeof(QualityDeviationCaseType));
        ser.Serialize(stringwriter, oQualityDeviationCaseType);
        string s = stringwriter.ToString();
        Match m = Regex.Match(s,pattern);
        if(m.Success)
           s=s.Replace(m.Value, "");


        sampleChannel.Publish(s);
        //This line of code sending my xml file to IBM WMQ.
    }

我对XmlSerializer并不熟悉,但我认为这应该可行。匹配只会找到以'xmlns =“'开头并以'”'结尾的任何内容。