如何从确切响应中提取 XML 值

Posted

技术标签:

【中文标题】如何从确切响应中提取 XML 值【英文标题】:How to Extract XML value from Exact Response 【发布时间】:2021-04-23 11:31:00 【问题描述】:

我需要从此 XML 中获取 Description0, ItemCode 的值。

<?xml version="1.0" encoding="utf-8"?>
<feed xml:base="http://afasfs/services/Exact.Entity.REST.EG/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <id>http://afasfs/services/Exact.Entity.REST.EG/Item/</id>
    <title type="text">Item</title>
    <link rel="self" title="Item" href="Item" />
    <entry>
        <id>http://afasfs/services/Exact.Entity.REST.EG/Item('00X0')</id>
        <link rel="edit" title="Item" href="Item('00X0')" />
        <title />
        <content type="application/xml">
            <m:properties>
                <d:Description0>HEX S/DRILL SCREW NEO 14-10 X 75 C4 (PK100)</d:Description0>
                <d:ItemCode>0V0X0sdfA</d:ItemCode>
            </m:properties>
        </content>
    </entry>
</feed>

我已尝试执行以下操作,但它们都不起作用并出现此错误

“:”字符,十六进制值 0x3A,不能包含在名称中。

var itemElements = xDoc.Descendants("feed");
var itemElements = xDoc.Element("feed");
var itemElements = xDoc.Elements("feed");
var itemElements = xDoc.Root.Elements("feed");
var itemElements = xDoc.Elements("feed").Element("entry");

foreach (XElement elem in itemElements.Elements())

提前感谢您的帮助。

【问题讨论】:

你需要包含命名空间,例如XNamespace atom = "http://www.w3.org/2005/Atom"; xDoc.Descendants(atom + "feed"); 这能回答你的问题吗? Linq: Elements not working when I have a namespace in XML file @KlausGütter No 【参考方案1】:

您可以使用 命名空间 来获取值:

1 - 声明所有Namespace

XNamespace xn = "http://www.w3.org/2005/Atom";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";

2 - 查询以获取 Description0, ItemCode:

var properties = xDoc
    .Descendants(xn + "entry")
    .Descendants(m + "properties")
    .Select(p => new  Description = p.Element(d + "Description0")?.Value, ItemCode = p.Element(d + "ItemCode")?.Value )
    .FirstOrDefault();

3 - 所有代码:

string xml = @"
<feed xml:base=""http://afasfs/services/Exact.Entity.REST.EG/"" xmlns=""http://www.w3.org/2005/Atom"" xmlns:d=""http://schemas.microsoft.com/ado/2007/08/dataservices"" xmlns:m=""http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"">
    <id>http://afasfs/services/Exact.Entity.REST.EG/Item/</id>
    <title type=""text"">Item</title>
    <link rel=""self"" title=""Item"" href=""Item"" />
    <entry>
        <id>http://afasfs/services/Exact.Entity.REST.EG/Item('00X0')</id>
        <link rel=""edit"" title=""Item"" href=""Item('00X0')"" />
        <title />
        <content type=""application/xml"">
            <m:properties>
                <d:Description0>HEX S/DRILL SCREW NEO 14-10 X 75 C4 (PK100)</d:Description0>
                <d:ItemCode>0V0X0sdfA</d:ItemCode>
            </m:properties>
        </content>
    </entry>
</feed>";

XDocument xDoc = XDocument.Parse(xml);

XNamespace xn = "http://www.w3.org/2005/Atom";
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";

var properties = xDoc
    .Descendants(xn + "entry")
    .Descendants(m + "properties")
    .Select(p => new  Description = p.Element(d + "Description0")?.Value, ItemCode = p.Element(d + "ItemCode")?.Value )
    .FirstOrDefault();

Console.WriteLine($"Description0: properties.Description , ItemCode:properties.ItemCode");

结果

Description0:HEX S/DRILL SCREW NEO 14-10 X 75 C4 (PK100) , ItemCode:0V0X0sdfA

希望对您有所帮助。

【讨论】:

以上是关于如何从确切响应中提取 XML 值的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式。如何从xml文档中提取值[关闭]

如何从邮递员的响应标头中提取特定的字符串值?

如何从 axios 响应对象中的所有项目中提取特定值到 vuex 状态

如何从 JMeter 的 json 响应中的长 html 内容中提取特定的 *token* 值

邮递员:如何从 html 响应中提取值并将其传递给邮递员中的下一个请求

如何从PostgreSQL的嵌套xml对象中提取值?