Заменить текст другим текстом в той же строке - PullRequest
0 голосов
/ 25 марта 2010

Я не знаю, смогу ли я использовать регулярные выражения для этого, но я хочу заменить что-то в этом XML:

<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute>
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute>

должно стать

<Attribute_1>Danny Boyle</Attribute_1>
<DVD-releasedatum>06/10/1999</DVD-releasedatum>

Удалить это из первого тега не сложно, но как я могу закрыть свой новый тег?

Ответы [ 5 ]

2 голосов
/ 25 марта 2010

Это похоже на работу для XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="custom-attribute">
        <xsl:element name="{@name}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Это дает желаемый результат и очень гибкий для будущих изменений и расширений.

1 голос
/ 25 марта 2010
while(<DATA>)
{
  if($_=~s/^\<.*=\"(.*)\" .*\>([a-zA-Z]+|[0-9\/ ]+).*/<$1>$2<\/$1>/)
  {
      print $_;
  }
 }
__DATA__
<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute>
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute>
1 голос
/ 25 марта 2010

Это работает для C # (не знаю, какой язык вы используете):

string input = "<custom-attribute name=\"Attribute_1\" dt:dt=\"string\">Danny Boyle</custom-attribute>\r\n<custom-attribute name=\"DVD-releasedatum\" dt:dt=\"string\">06/10/1999</custom-attribute>";

string output = Regex.Replace(input, "<custom-attribute name=\"(.*?)\".*?>(.*?)</custom-attribute>", "<$1>$2</$1>");

выход:

<Attribute_1>Danny Boyle</Attribute_1>
<DVD-releasedatum>06/10/1999</DVD-releasedatum>
1 голос
/ 25 марта 2010

Используя, например, gvim, это сделает это:

:%s/.*name="\([^"]*\)"[^>]*>\([^<]*\)<.*/<\1>\2<\/\1>/cg

Это подходящая часть:

.*name="\([^"]*\)"[^>]*>\([^<]*\)<.*

Это запасная часть:

<\1>\2<\/\1>
1 голос
/ 25 марта 2010

Если вы хотите сделать это один раз, можно заменить Regex. В противном случае существуют более эффективные способы преобразования XML, например XSLT .

Для использования Regex вы можете заменить

\<custom-attribute.*?name="(\w+)".*?\>(.*?)\</custom-attribute\>

с

<$1>$2</$1>

Замените $ 1 и $ 2 теми ссылками, которые называются в вашей программе. Впрочем, сначала сохраните резервную копию =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...